nee*_*ebz 45 memory-leaks node.js
我们知道node.js为我们提供了强大的力量,但强大的力量带来了巨大的责任.
据我所知,V8引擎不做任何垃圾收集.那么我们应该避免哪些最常见的错误,以确保没有内存从我的节点服务器泄漏.
编辑: 对不起我的无知,V8确实有一个强大的垃圾收集器.
Ray*_*nos 65
据我所知,V8引擎不做任何垃圾收集.
V8在构建中具有强大而智能的垃圾收集器.
您的主要问题是不了解闭包如何保持对外部函数的作用域和上下文的引用.这意味着有多种方法可以创建循环引用或以其他方式创建只是不清理的变量.
这是因为您的代码是不明确的,并且编译器无法判断垃圾收集它是否安全.
强制GC获取数据的一种方法是使变量为空.
function(foo, cb) {
var bigObject = new BigObject();
doFoo(foo).on("change", function(e) {
if (e.type === bigObject.type) {
cb();
// bigObject = null;
}
});
}
Run Code Online (Sandbox Code Playgroud)
v8如何知道在事件处理程序中垃圾收集大对象是否安全?它不是这样你需要通过将变量设置为null来告诉它不再使用它.
各种文章阅读:
duk*_*ave 24
我想说服自己接受的答案,特别是:
不了解闭包如何保持对外部函数的范围和上下文的引用.
所以我写了下面的代码来演示变量如何无法清理,人们可能会感兴趣.
如果您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');
});
}());
Run Code Online (Sandbox Code Playgroud)
小智 9
活动垃圾收集:
node --expose-gc test.js
Run Code Online (Sandbox Code Playgroud)
并用于:
global.gc();
Run Code Online (Sandbox Code Playgroud)
快乐编码:)
| 归档时间: |
|
| 查看次数: |
38961 次 |
| 最近记录: |