相关疑难解决方法(0)

如何防止node.js中的内存泄漏?

我们知道node.js为我们提供了强大的力量,但强大的力量带来了巨大的责任.

据我所知,V8引擎不做任何垃圾收集.那么我们应该避免哪些最常见的错误,以确保没有内存从我的节点服务器泄漏.

编辑: 对不起我的无知,V8确实有一个强大的垃圾收集器.

memory-leaks node.js

45
推荐指数
3
解决办法
4万
查看次数

在javascript中关闭和回调内存泄漏

function(foo, cb) {
  var bigObject = new BigObject();
  doFoo(foo, function(e) {
     if (e.type === bigObject.type) {
          cb();
          // bigObject = null;
     }
  });
}
Run Code Online (Sandbox Code Playgroud)

上面的例子显示了一个经典的,偶然的(或可能没有)内存泄漏的闭包.V8垃圾收集器无法确定是否可以安全删除bigObject它,因为它在回调函数中被使用,可以多次调用.

一种解决方案是设置bigObjectnull回调函数中的作业何时结束.但是如果你使用了很多变量(想象有n变量之类的bigObject,并且它们都在回调中使用)那么清理它就成了一个难看的问题.

我的问题是:有没有其他方法可以清理那些使用过的变量?

编辑这是另一个(现实世界)的例子:所以我从mongodb获得应用程序并将其与其他应用程序进行比较.来自mongodb的回调使用从该回调中定义的变量应用程序.从mongodb得到结果后,我还将它作为回调返回(因为它都是异步的,我不能写回程).所以实际上我可以将回调一直传播到源...

function compareApplications(application, condition, callback) {

    var model = database.getModel('Application');
    model.find(condition, function (err, applicationFromMongo) {
        var result = (applicationFromMongo.applicationID == application.applicationID)
        callback(result)        
    }
}
Run Code Online (Sandbox Code Playgroud)

javascript closures memory-leaks node.js

18
推荐指数
1
解决办法
7482
查看次数

Chrome/V8不垃圾收集循环引用?

看一下Chrome堆快照的这一部分:

Chrome循环参考

它显示了堆中对象的保留器,据我所知并且可以看到,它应该是垃圾,但是尽管如此,它仍然没有被收集.

毕竟,到根的"最短"路径是一条循环路径(它实际上从未到达根路径).令人不禁的是,快照查看器如何能够为它分配12的距离?这只是在放弃之前整个周期所采取的步骤数量吗?注意距离永远不会低于11.

我已经读过,可能需要几次迭代来清理带有循环引用的子图.但是重复强制收集(使用"时间轴"选项卡中的垃圾箱按钮)无法清除这些对象.

请注意,通过'185'引用进行探索最终会导致相同system / Context @862399,因此确实没有从根到此对象的路径(至少在此处不可见).

我疯了,还是垃圾收集器真的坏了?我不记得过去有过这个问题.我在Chrome 45.0.2454.101上.Beta 46.0.2490.64表现相同.

javascript garbage-collection google-chrome v8 circular-reference

15
推荐指数
1
解决办法
1417
查看次数