我有一个关于谷歌浏览器的垃圾收集(版本20.0.1132.47的,Ubuntu 11.04 64位)的问题。
虽然比较堆转储和检查内存泄漏,我发现了一些情况下,那些从来不清理。 通常情况下这种行为可以被追踪到一个程序员的错误,但在这种情况下,我宁愿无能..
看看下面的截图
实例“孩子@ 610739”仅由属于儿童实例本身的功能“bound_this”实例引用。 所以我的理解,孩子实例应该是垃圾收集,因为它的唯一其他参考保持保持是儿童实例本身(通过“bound_this”功能)。
我使用underscore.js' bindAll“效用函数( underscore.js#bindAll映射到镀铬的‘native_bind’功能)( 上bound_this ECMA脚本维基 )
我在这里缺少一些东西很明显,如果是这样,可能有人解释什么是保持这些实例还活着吗?
更新:
在此期间我测试了chrominium相同的应用程序(18.0.1025.168(开发版本的Linux 134367)的Ubuntu 11.10),它不显示这些未实例..
更新2:
继Esailijas提示提供的jsfiddle片段中,我创建了一个( http://jsfiddle.net/8gSTR/1/ )模仿什么,我基本上是做。 运行该小提琴遗憾的是不显示我遇到我的应用程序的错误行为。 而“a'结构实例仍然被引用采取堆转储虽然看起来有点类似,尽管从window.o阵列保持实例活着参考:
作为这样的引用在我的情况(截图1)缺少的,我不知道是什么让从铬释放这些情况下...
更新3:
其次loislos建议启用隐藏属性。 结果(带有扩展的分支之一),可以在下面的截图中可以看出,但它并不需要我的任何进一步。
你的怀疑,这是不是一个实际的内存泄漏,但与铬的怪事是正确的。
我最近遇到了同样的问题跑了。 IE11将不显示this.func = _.bind(this.func,这个)一边Chrome将内存泄漏,按垃圾收集按钮100倍甚至之后。
它会告诉你它与jsflag废话甚至运行后铬露出下面的垃圾收集器和调用GC 100倍。
一个简单的方法来证明它其实不是在Chrome中泄漏,使一个小问题与浏览器的一个主要问题,并迫使引擎采取行动。
在已分配给它的束缚功能分配一个新的属性这样的实例:
target.WhyAmILeaking =新阵列(2亿)。加入( “YOURNOT”);
做镀铬三个快照技术,你会看到出现在堆大约214mb打卡该字符串。 做任何建设性的行动(第二快照)再次,你会看到堆到423mb或留在214mb。 如果它一直就大功告成了,你证明了原来的214mb已收集。 如果它不留做你的破坏作用(第三个快照),它会返回到214mb也证明原来得到收集。
如果只是停留在423mb你的先生或女士有泄漏。
哦,另一组跨越完全相同的情况下跑了可怜的灵魂的: https://github.com/jashkenas/backbone/issues/2269#issuecomment-13610969
TL; DR; 使用IE 11,用于检测泄漏。
我在此所指的EcmaScript ,这个术语“约束这个”带班,
类方法已经“束缚,这”,在这种方法主体总是势必从中提取的方法,不管是什么这个参数在实际传递给方法的类实例(此参数的方法被忽略) 。
现在,在这里你的例子有鉴于所以没有示例脚本不能具体的质疑,
我不得不说,如果这是不漏..
然后什么都反对,一流的剧本是有界的,它不会叫垃圾,直到类/对象存在这个函数是有界与同一个对象。它会收集垃圾只有其父母的(对象/课后与它弹跳的)范围结束。
现在,如果循环引用当任务将完成它会结束,这个>>就像递归(介意的概念,不一样)的概念..所以到底会从通话的开始..相反的..内大多数呼叫(最近通话)将首先发布..等等
该代码必须是越野车,因为它们必须不能结合和定义功能,每次重复使用..但如果他们再结合也应该很好地工作,不应泄露,直到足迹超出内存池的浏览器限制。
我希望这将解释..
你是否触发“强制气相色谱法”使用的开发工具? 如果是这样的话和对象再坚持那么,上述研究的价值。
如果不触发通过开发工具GC,那么就请记住,GC引擎的工作方式是相当复杂的,它有代收集的(使用两代)的概念。
http://www.html5rocks.com/en/tutorials/memory/effectivemanagement/#toc-v8-gc
这可能仅仅是你没有达到所需的阈值触发年轻一代GC,或该对象已被终身教授的老一代,但一个老一代GC从未被触发。
不幸的是,开发者工具似乎并没有表现出这一代人GC'd。