我们知道node.js为我们提供了强大的力量,但强大的力量带来了巨大的责任。
据我所知,V8引擎不进行任何垃圾回收。那么我们应该避免哪些最常见的错误,以确保没有内存从我的节点服务器泄漏。
修改 对不起我的无知,V8确实有一个强大的垃圾收集器。
答案 0 :(得分:64)
据我所知,V8引擎没有 做任何垃圾收集。
V8在构建中具有强大而智能的垃圾收集器。
您的主要问题是不了解闭包如何维护对外部函数的作用域和上下文的引用。这意味着有多种方法可以创建循环引用或以其他方式创建仅 not 清理的变量。
这是因为您的代码是 ambigious ,并且编译器无法判断它是否安全来垃圾收集它。
强制GC获取数据的一种方法是使变量为空。
function(foo, cb) {
var bigObject = new BigObject();
doFoo(foo).on("change", function(e) {
if (e.type === bigObject.type) {
cb();
// bigObject = null;
}
});
}
v8如何知道在事件处理程序中垃圾收集大对象是否安全?它不是这样你需要通过将变量设置为null来告诉它它不再被使用。
阅读各种文章:
答案 1 :(得分:22)
我想说服自己接受的答案,特别是:
不了解闭包如何保持对外部函数的作用域和上下文的引用。
所以我编写了以下代码来演示如何清除变量,人们可能会感兴趣。
如果watch -n 0.2 'ps -o rss $(pgrep node)'
在另一个终端中运行,您可以观察发生的泄漏。请注意,使用buffer = null
对nextTick
或进行评论将如何完成此过程:
(function () {
"use strict";
var fs = require('fs'),
iterations = 0,
work = function (callback) {
var buffer = '',
i;
console.log('Work ' + iterations);
for (i = 0; i < 50; i += 1) {
buffer += fs.readFileSync('/usr/share/dict/words');
}
iterations += 1;
if (iterations < 100) {
// buffer = null;
// process.nextTick(function () {
work(callback);
// });
} else {
callback();
}
};
work(function () {
console.log('Done');
});
}());
答案 2 :(得分:8)
活动垃圾收集:
node --expose-gc test.js
并使用:
global.gc();
快乐编码:)