javascript - 如何检测 v8 堆使用量接近 Node.js 中的限制

标签 javascript node.js out-of-memory 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()}%)`);
}

此解决方案无法正常工作。

当我尝试这个命令时: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。前两个大致对应于托儿所和终身对象堆,尽管理论上对象可以位于五个空间中的任何一个。

更准确的衡量标准是使用 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实际上是new space(33554432)、old space(205475840)、code(2097152)、map(2179072)、large object(0)的总和。

正如您所见,所有其他空间都很健康,而旧空间已接近耗尽,而实际耗尽来自那里。

希望这对您有所帮助。

关于javascript - 如何检测 v8 堆使用量接近 Node.js 中的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40158103/

相关文章:

javascript - 未捕获的类型错误 : Cannot read property 'img' of undefined

javascript - 测试 React Js 根组件

javascript - setCustomValidity Bootstrap 保持错误弹出

javascript - 路由到静态 HTML 页面,以及 Express 中的模板化动态路由

c++ - 疯狂地尝试针对 OpenSSL/libcrypto 进行编译

ios - 在 CollectionView 中使用 SDWebImage 的疯狂内存问题(在 tableviewCell 内)

node.js - 强制依赖使用特定的子依赖版本

javascript - ExpressJS RESTapi动态设置路由

C:从内存运行机器码

android - 在 ImageView 中设置图像时内存不足