Как доказать максимальный предел кучи по умолчанию для v8 в nodejs? Или, если метод "process.memoryUsage ()" точно показывает общую кучу? - PullRequest
0 голосов
/ 22 мая 2019

Я прочитал одну книгу. Там написано, что максимальное старое поколение v8 по умолчанию - 1.4G в x64. Используйте метод "process.memoryUsage ()", чтобы показать использование памяти. Автор докажет это с помощью некоторого кода, повторите объект push Array.к глобальной вар.Через несколько раз нехватка памяти произошла.Когда я пишу какой-то другой код, повторяю запись некоторых строк в файл. Предел быстро нарушается. Так что же отличается от нашего кода в использовании памяти?Действительно ли метод "process.memoryUsage ()" показывает использование памяти?(Моя ОС Windows x64,16G памяти, узел 8, параметры узла по умолчанию) Любая помощь будет благодарна !!!

Вот код автора:

outofmemory.js

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();

Out put

...
Process: heapTotal 1286.92 MB heapUsed 1284.28 MB rss 1301.80 MB
--------------------------8---------------------------------

<--- Last few GCs --->

[15468:00000267A6225110]     1074 ms: Mark-sweep 1284.0 (1290.9) -> 1283.9 (1290.9) MB, 119.4 / 0.0 ms  allocation failure GC in old space requested
[15468:00000267A6225110]     1195 ms: Mark-sweep 1283.9 (1290.9) -> 1283.9 (1287.9) MB, 120.7 / 0.0 ms  last resort GC in old space requested
[15468:00000267A6225110]     1314 ms: Mark-sweep 1283.9 (1287.9) -> 1283.9 (1287.9) MB, 118.6 / 0.0 ms  last resort 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();

Выход:

...
Process: heapTotal 2733.34 MB heapUsed 2655.47 MB rss 2756.39 MB
-----------------------------199--------------------------------


<--- Last few GCs --->

[24568:000001E7950D8B40]   380916 ms: Mark-sweep 2660.1 (2748.3) -> 2660.0 (2748.8) MB, 2900.9 / 0.0 ms  allocation failure GC in old space requested
[24568:000001E7950D8B40]   383390 ms: Mark-sweep 2660.0 (2748.8) -> 2660.0 (2715.3) MB, 2473.2 / 0.0 ms  last resort GC in old space requested
[24568:000001E7950D8B40]   385803 ms: Mark-sweep 2660.0 (2715.3) -> 2660.0 (2712.3) MB, 2411.6 / 0.0 ms  last resort GC in old space requested
...

1 Ответ

0 голосов
/ 23 мая 2019

Наконец, я получил это сам

Напечатанный «heapTotal, heapUsed» включает в себя как старое, так и новое поколение. Оба они могут быть установлены с помощью параметров узла:

(CentOS 7.3 x64 4G)

 node --max-old-space-size=100  --max_semi_space_size=100  wf.js
...