848400
最近在读朴灵老师的《深入浅出》一书,其中提到了x64,老年代内存默认限制 x64 1.4g。并且使用一段代码演示了内存溢出(为了打印方便我稍作了改动)。
var showMem = function (times) {
var mem = process.memoryUsage();
var format = function (bytes) {
return (bytes / 1024 / 1024).toFixed(2) + ' MB';
};
console.log('Process: heapTotal ' + format(mem.heapTotal) +
' heapUsed ' + format(mem.heapUsed) + ' rss ' + format(mem.rss));
console.log(`--------------------------${times}---------------------------------`);
};
var useMem = function () {
var size = 20*1024 * 1024;
var arr = new Array(size);
for (var i = 0; i < size; i++) {
arr[i] = 0;
}
return arr;
};
var total = [];
for (var j = 0; j < 10000; j++) {
showMem(j);
total.push(useMem());
}
showMem();
正如预期,代码运行到内存需要占用1.4g的时候产生了内存溢出
Process: heapTotal 1286.92 MB heapUsed 1284.28 MB rss 1301.82 MB
--------------------------8---------------------------------
<--- Last few GCs --->
[23880:00000219B66A3AB0] 1055 ms: Mark-sweep 1284.0 (1290.9) -> 1283.9 (1290.9) MB, 119.6 / 0.0 ms allocation failure GC in old space requested
我又写了一段代码,把一段字符重复写入文件。却没有产生同样的预期,代码如下:
const fs = require('fs');
async function writeFile(){
const fd = fs.openSync('a.log', 'a');
const log = async (entry) =>{
await fs.writeSync(fd, entry+'\r\n', null, 'utf8');
await fs.fsyncSync(fd);
}
for(let t = 0; t<10000 ; t++ ) {
for(var i = 0x4E00;i<=0x9FBF;++i)
log(String.fromCharCode(i));
showMem({times:t});
}
}
const showMem = function ({times}) {
const mem = process.memoryUsage();
const format = function (bytes) {
return (bytes / 1024 / 1024).toFixed(2) + ' MB';
};
console.log('Process: heapTotal ' + format(mem.heapTotal) +
' heapUsed ' + format(mem.heapUsed) + ' rss ' + format(mem.rss));
console.log(`-----------------------------${times}--------------------------------\r\n`)
}
writeFile();
代码在执行了200次后,发生了内存溢出,打印如下
Process: heapTotal 2736.84 MB heapUsed 2654.99 MB rss 2759.86 MB
-----------------------------199--------------------------------
<--- Last few GCs --->
[4648:00000184CB8B2380] 450417 ms: Mark-sweep 2660.1 (2751.3) -> 2660.0 (2717.8) MB, 2757.0 / 0.0 ms last resort GC in old space requested
[4648:00000184CB8B2380] 453198 ms: Mark-sweep 2660.0 (2717.8) -> 2660.0 (2713.8) MB, 2779.5 / 0.0 ms last resort GC in old space requested
可以看到,堆内存打印出来的是2.7g,这个使我很困惑,同样的环境,为什么我的代码显示可以占用更多的堆内存?而朴灵老师的代码可以证实1.4g堆内存?是我的写法有问题还是这种说法基于哪些上下文?(我的系统是 windows x64, 16g内存, node -v v8.11.4 ,node_options都是默认,没有设置堆内存) 如能提供帮助,不胜感激。