JS引擎何时创建垃圾收集根?

时间:2012-03-17 08:08:24

标签: javascript v8

一点背景

我正在使用ExtJS3开发一个大型JS应用程序。在运行时,用户可以打开和关闭许多小部件,从而可能增加内存使用量。我使用Chrome's heap analyzer修复了许多内存空洞,但在某些情况下我找不到罪魁祸首。堆分析器显示类似GCRoot[1234]->store.items的内容,我找不到将引用存储的代码部分。

问题

V8(或任何其他JS引擎)创建新的垃圾收集器根目录的确切运行时条件是什么?是否存在强制它的某些代码模式(闭包,eval,事件监听......)?

2 个答案:

答案 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引擎的性能。

为任何未使用的变量/属性设置空值。

希望这有帮助