在Node.js中,如何检测v8堆的使用情况已接近极限

现在我用:

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()}%)`); } 

此解决scheme不正确的工作。

当我尝试这个命令:node –max-old-space-size = 100 index.js我的进程由于无法分配内存而下降,当我的脚本计算~56%

 getHeapStatistics().heap_size_limit is 178 MB getHeapStatistics().used_heap_size is ~95 MB 

如何更准确地检测出情况,何时可以发现内存不足的错误?

v8堆实际上被分割成区域或空间:new_space,old_space,code_space,map_space和large_object_space。 前两个大致对应于托儿所和终身物体堆,尽pipe理论上物体可以坐在五个空间中的任何一个中。

更准确的衡量标准是使用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()}%)`); } 

内存耗尽前的统计:

 #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 

我们可以看到,total_heap_size:243306496实际上是新空间(33554432),旧空间(205475840),代码(2097152),地图(2179072),大对象(0)的总和。

正如你所看到的,所有其他的空间都是健康的,而旧的空间已经接近枯竭,而实际的疲惫从此而来。

希望这可以帮助。