节点中已分配变量的内存使用情况(带有解析)

时间:2015-12-29 09:52:25

标签: node.js memory restify

setInterval(() => {
    var mem = process.memoryUsage();
    console.info("Memory used: ", mem.heapUsed.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " "));
}, 1000);

server.get("/", function(req, res, next) {
    var test = new Array(1e7);
    test = null;
    res.send(200);
    next();
});

间隔计时器保持报告或多或少稳定的内存使用量,但是在我向restify-endpoint请求之后,它上升了80 MB(当我分配一个1000万元素数组时自然而然),但随后它还在那里。这是否意味着即使在为变量赋值null后,大数组仍然在内存中?

Memory used:  82 645 408
Memory used:  82 647 240
Memory used:  82 649 072
Memory used:  82 650 904
Memory used:  82 652 736
Memory used:  163 126 464
Memory used:  163 136 128
Memory used:  163 137 968
Memory used:  163 139 808
Memory used:  163 141 648
Memory used:  163 143 488
Memory used:  163 145 328

这是一个非常简化的示例,最终目标是避免api端点中使用的对象在不再使用时留在内存中。

1 个答案:

答案 0 :(得分:0)

如果您在V8 garbage collection上查看此文章,您会看到:

  

大对象空间:此空间包含大于的对象   其他空间的大小限制。每个对象都有自己的mmap   记忆区域。大型物体永远不会被垃圾移动   收集器。

我不知道什么是“大型物体”的具体细节,但是1000万的数组似乎可能符合描述。问题是,如果垃圾收集器从未移动大对象,那么它们如何清理?我还没有找到答案。

但是,如果在终端中启动节点,然后重复运行此命令

var myarr = new Array(1e7)

你会看到内存确实会增加,但只会到某一点。我发现只要内存使用超过500MB,就会发生某种垃圾收集,内存使用量下降到251MB。所以,虽然它可能看起来像你的大阵列永远不会消失,但V8实际上会在某些时候对它做些什么。