- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我对 google chrome(版本 20.0.1132.47,Ubuntu 11.04 64 位)中的垃圾收集有疑问。
在比较堆转储和检查内存泄漏时,我发现了一些从未清理过的实例。通常这种行为可以追溯到程序员错误,但在这种情况下,我相当无能..
看看下面的截图
实例“child @610739”仅由属于子实例本身函数的“bound_this”实例引用。因此,据我了解,子实例应该被垃圾收集,因为保持它的唯一其他引用是子实例本身(通过 'bound_this' 函数)。
我正在使用 underscore.js 的“bindAll”实用函数 (underscore.js#bindAll),它映射到 chrome 的“native_bind”函数 (ECMA Script wiki on bound_this)
我是否在这里遗漏了一些明显的东西,如果有,有人可以解释是什么让这些实例保持活力吗?
更新:
与此同时,我在 chrominium (18.0.1025.168 (Developer Build 134367 Linux) Ubuntu 11.10) 中测试了相同的应用程序,它没有显示这些悬空实例..
更新 2:
按照 Esailijas 提示提供一个 jsfiddle 片段,我创建了一个 (http://jsfiddle.net/8gSTR/1/) 来模仿我基本上正在做的事情。不幸的是,运行这个 fiddle 并没有显示我在我的应用程序中遇到的不当行为。尽管来自 window.o 数组的引用使实例保持事件状态,但在仍然引用“a”实例时进行的堆转储看起来有点相似:
在我的案例中缺少这样的引用(屏幕截图 1)我不知道是什么让 chrome 无法释放这些实例...
更新 3:
遵循 loislos 的建议以启用隐藏属性。结果(其中一个分支已展开)可以在下面的屏幕截图中看到,但它并没有让我更进一步。
最佳答案
您怀疑这不是实际的内存泄漏,而是 chrome 的怪异是正确的。
我最近遇到了同样的问题。 IE11 不会将 this.func = _.bind(this.func, this) 显示为内存泄漏,而 chrome 会显示,即使您按下收集垃圾按钮 100 次。
即使你用 jsflag 废话运行 chrome 并暴露底层垃圾收集器并调用 gc 100 次,它也会显示它。
证明它实际上不是 chrome 泄漏的一种简单方法是将小问题变成浏览器的大问题并强制引擎采取行动。
在分配了绑定(bind)函数的实例上分配一个新属性,如下所示:
target.WhyAmILeaking = new Array(200000000).join("YOURNOT");
使用 chrome 执行三个快照技术,您会看到堆中的字符串以大约 214mb 的速度出现。再次执行任何建设性操作(第二个快照),您会看到堆达到 423mb 或保持在 214mb。如果它保持不变,您就证明原始的 214mb 已被收集。如果它不继续执行您的破坏性操作(第三个快照),它会回到 214mb,也证明原始文件已被收集。
如果它只是保持在 423mb,你先生或女士有泄漏。
哦,还有一群遇到完全相同情况的可怜人:https://github.com/jashkenas/backbone/issues/2269#issuecomment-13610969
TL;DR;使用 IE 11 检测泄漏。
关于javascript - 仅由 'bound_this' 引用的实例不会被垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11576372/
我对 google chrome(版本 20.0.1132.47,Ubuntu 11.04 64 位)中的垃圾收集有疑问。 在比较堆转储和检查内存泄漏时,我发现了一些从未清理过的实例。通常这种行为可以
我是一名优秀的程序员,十分优秀!