bui*_*kii 7 javascript v8 out-of-memory node.js
现在我使用:
const v8 = require('v8');
let heap = v8.getHeapStatistics();
let usage = 100 / heap.heap_size_limit * heap.used_heap_size;
if (usage > 90) {
console.log(`V8 heap usage close to the limit (${usage.toFixed()}%)`);
} else if (usage > 95) {
console.log(`V8 heap usage very close to the limit (${usage.toFixed()}%)`);
}
Run Code Online (Sandbox Code Playgroud)
此解决方案无法正常工作.
当我尝试这个命令时:node --max-old-space-size = 100 index.js当我的脚本计算时,我的进程无法分配内存~56%
getHeapStatistics().heap_size_limit is 178 MB
getHeapStatistics().used_heap_size is ~95 MB
Run Code Online (Sandbox Code Playgroud)
当我们出现内存错误时,如何更准确地检测情况?
小智 5
v8 堆实际上被分成区域或空间:new_space、old_space、code_space、map_space 和 large_object_space。前两个大致对应于托儿所和终身对象堆,尽管理论上对象可以位于五个空间中的任何一个。
更准确的测量方法是使用 old_space 的 space_size 和 space_used_size。
var space = v8.getHeapSpaceStatistics();
var old_space_total = space[1].space_size;
var old_space_used = space[1].space_used_size;
var usage = 100 / old_space_total * old_space_used;
if (usage > 90) {
console.log(`V8 heap usage close to the limit (${usage.toFixed()}%)`);
} else if (usage > 95) {
console.log(`V8 heap usage very close to the limit (${usage.toFixed()}%)`);
}
Run Code Online (Sandbox Code Playgroud)
内存耗尽前的统计数据:
#node --max_old_space_size=200 heap.js
...
{ total_heap_size: 243306496,
total_heap_size_executable: 5242880,
total_physical_size: 243306496,
total_available_size: 19149632,
used_heap_size: 215801616,
heap_size_limit: 243269632 }
[ { space_name: 'new_space',
space_size: 33554432,
space_used_size: 16464888,
space_available_size: 41992,
physical_space_size: 33554432 },
{ space_name: 'old_space',
space_size: 205475840,
space_used_size: 197215464,
space_available_size: 18462512,
physical_space_size: 205475840 },
{ space_name: 'code_space',
space_size: 2097152,
space_used_size: 680416,
space_available_size: 617024,
physical_space_size: 2097152 },
{ space_name: 'map_space',
space_size: 2179072,
space_used_size: 1452528,
space_available_size: 18800,
physical_space_size: 2179072 },
{ space_name: 'large_object_space',
space_size: 0,
space_used_size: 0,
space_available_size: 0,
physical_space_size: 0 } ]
V8 heap usage close to the limit (96%)
...
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
Run Code Online (Sandbox Code Playgroud)
我们可以看到,total_heap_size:243306496实际上是新空间(33554432)、旧空间(205475840)、代码(2097152)、映射(2179072)、大对象(0)的总和。
正如你所看到的,所有其他空间都是健康的,而旧空间则接近耗尽,而真正的耗尽来自那里。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
1206 次 |
| 最近记录: |