如何防止node.js中的内存泄漏?
我们知道node.js为我们提供了强大的力量,但是强大的力量却承担着巨大的责任。
据我所知,V8引擎不做任何垃圾收集。 那么我们应该避免哪些最常见的错误,以确保没有内存从我的节点服务器泄漏。
编辑:对不起,我的无知,V8确实有一个强大的垃圾收集器。
据我所知,V8引擎不做任何垃圾收集。
V8拥有强大而智能的垃圾收集器。
你的主要问题是不理解封闭是如何保持对外部函数范围和上下文的引用。 这意味着您可以通过多种方式创build循环引用或者创build只是不被清理的variables。
这是因为你的代码是模糊的 ,编译器无法判断垃圾收集是否安全 。
强制GC提取数据的一种方法是清空你的variables。
function(foo, cb) { var bigObject = new BigObject(); doFoo(foo).on("change", function(e) { if (e.type === bigObject.type) { cb(); // bigObject = null; } }); }
v8如何知道在事件处理程序中垃圾收集大对象是否安全? 它不这样,所以你需要告诉它不再使用variables设置为null。
各种文章阅读:
我想说服自己接受的答案,特别是:
不理解封闭是如何保持对外部function的范围和背景的参考。
所以我写了下面的代码来演示variables如何不能被清理,哪些人可能会感兴趣。
如果你在另一个terminal上运行了watch -n 0.2 'ps -o rss $(pgrep node)'
,你可以观察到发生了泄漏。 请注意,在buffer = null
或使用nextTick
进行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'); }); }());
主动垃圾收集与:
node --expose-gc test.js
并用于:
global.gc();
快乐编码:)
SBuffer v2 (静态缓冲区)function是您解决Node.js内存泄漏所需的全部function,而且非常易于使用。
npm install sbuffer
例如,分配2个缓冲区,每个300Mb(总共600Mb)和300/10(30Mb字节),用于垃圾使用。 这样,您的应用永远不会在内存使用上增长,因为它只使用分配的600Mb内存空间。
var SBuffer = require('sbuffer'); /* allocate 600Mb memory*/ var sb = SBuffer(2,3e8,10); sb.t0 = '01';/* add a key t0 with string value 01 */ console.log(sb.t0);/* print: <Buffer 30 31> */ console.log(sb.t0.toString());/* print: 01 */
input值types必须是非空String
或Buffer
,输出types只有Buffer
,如果不存在,输出typesundefined
。
SBuffer从“scratch”为您的应用程序添加一个不错的function,但对于那些现有的,你只能祈祷:)