我正在使用ExtJS3开发一个大型JS应用程序。在运行时,用户可以打开和关闭许多小部件,从而可能增加内存使用量。我使用Chrome's heap analyzer修复了许多内存空洞,但在某些情况下我找不到罪魁祸首。堆分析器显示类似GCRoot[1234]->store.items
的内容,我找不到将引用存储的代码部分。
V8(或任何其他JS引擎)创建新的垃圾收集器根目录的确切运行时条件是什么?是否存在强制它的某些代码模式(闭包,eval,事件监听......)?
答案 0 :(得分:5)
GC根是垃圾收集器使用的特殊对象组,作为确定哪些对象的起点 有资格进行垃圾收集。 “root”只是一个对象 垃圾收集器假定默认情况下是可以访问的,然后有它 跟踪引用以查找所有其他当前对象 到达。任何无法通过任何引用访问的对象 任何根对象的链被认为是不可达的并且会 最终被垃圾收集器摧毁。 在V8中,根源包含 当前调用堆栈中的对象(即局部变量和 当前正在执行的函数的参数),活动的V8句柄 范围,全局句柄和编译缓存中的对象。
通过http://zetafleet.com/blog/google-chromes-heap-profiler-and-memory-timeline
问:什么是GC根源?
答:很多事情:
- 内置对象图;
- 符号表;
- 堆栈的VM线程;
- 编译缓存;
- 处理范围;
- 全球手柄。
通过http://code.google.com/chrome/devtools/docs/heap-profiling.html
答案 1 :(得分:1)
我不是javascript内存管理方面的专家,但据我所知:
确保清理所有事件处理程序。附加到对象/元素的任何事件处理程序都将使GC难以完成其工作
尽可能使用原型继承:(http://www.crockford.com/javascript/private.html)。它允许对象在内存中引用相同的方法,而不是为每个对象重新创建一个 - 节省内存并提高javascript引擎的性能。
为任何未使用的变量/属性设置空值。
希望这有帮助