Javascript/Node.js数组内存管理
Javascript/Node.js array memory management
我有一个使用数组作为队列的场景,我对这个场景有一个关于内存的问题。
首先,我在global中创建了一个数组对象,并创建了一个生成器来不间断地将元素推入数组。
var arr = [];
function runningProducer() {
setInterval(itemProducer, 50);
function itemProducer() {
var item = generateItem();
arr.push(item);
}
function generateItem() {
return { a: Math.random(), };
}
}
然后,我创建一个客户在1秒内清空数组
function runningCustomer() {
setInterval(clearQueue, 1000);
function clearQueue() {
var t = arr.concat(arr);
arr = [];
}
}
并且运行上述函数一段时间后,我发现内存一直在增长。
setInterval(() => {
var mem = process.memoryUsage();
console.log(mem);
}, 2000);
我认为数组应该在set empty后释放内存,但不是。关于这个问题,请给我一些建议,有没有办法在javascript中手动释放内存?
这个问题的答案在Barmar的评论中。预留的内存不会在不再需要时立即释放。JavaScript依赖于垃圾收集来检测未使用的引用并将其释放回堆,但是垃圾收集是一个昂贵的过程,所以它只会每隔一段时间运行一次。
当我尝试运行您的代码时,内存使用确实增加了一两分钟,然后在垃圾收集运行时突然恢复到原始值。也许你只是看日志的时间不够长?
您可以手动运行垃圾收集,并通过运行带有--expose-gc
标志的node并执行global.gc()
来自己看到这一点,但是您不应该在在生产代码中这样做,除非您有非常很好的理由。
相关文章:
- 如何使用java脚本更改浏览器的内存管理以增加会话存储和本地存储的内存
- 主干网.js事件和内存管理
- JavaScript 中的内存管理
- 转换 Redis 密钥时的内存管理
- 在 javascript 函数和内存管理中声明变量
- jQuery:新的临时 DOM 元素的内存管理
- 主干 + 木偶 - 模型/集合的内存管理最佳实践
- 在 express/node.js API 中进行高效的服务器端 JavaScript 内存管理
- 电话间隙内存管理
- JavaScript 中的性能内存管理
- Javascript内存管理:删除和拼接
- Javascript内存管理(requestAnimationFrame回调)
- 使用THRE.JS对象的全局数组的Javascript内存管理
- 了解JavaScript中的内存管理,Mozilla
- 具有重复jQuery数据表AJAX调用的内存管理
- 内存管理在javascript jquery手机与phonegap
- 如何使用YUI进行适当的内存管理以避免泄漏
- Angularjs是如何用ngView处理内存管理的?
- NodeJS+Redis+WebSocket内存管理
- 加速器合金应用中的内存管理