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端点中使用的对象在不再使用时留在内存中。
答案 0 :(得分:0)
如果您在V8 garbage collection上查看此文章,您会看到:
大对象空间:此空间包含大于的对象 其他空间的大小限制。每个对象都有自己的mmap 记忆区域。大型物体永远不会被垃圾移动 收集器。
我不知道什么是“大型物体”的具体细节,但是1000万的数组似乎可能符合描述。问题是,如果垃圾收集器从未移动大对象,那么它们如何清理?我还没有找到答案。
但是,如果在终端中启动节点,然后重复运行此命令
var myarr = new Array(1e7)
你会看到内存确实会增加,但只会到某一点。我发现只要内存使用超过500MB,就会发生某种垃圾收集,内存使用量下降到251MB。所以,虽然它可能看起来像你的大阵列永远不会消失,但V8实际上会在某些时候对它做些什么。