Javascript JS引擎何时创建垃圾收集根目录? 一点背景
我正在用ExtJS3开发一个大规模的JS应用程序。在运行时,用户可以打开和关闭许多小部件,从而可能增加内存使用。我修复了许多内存漏洞,但在某些情况下,我就是找不到罪魁祸首。堆分析器显示类似于Javascript JS引擎何时创建垃圾收集根目录? 一点背景,javascript,v8,Javascript,V8,我正在用ExtJS3开发一个大规模的JS应用程序。在运行时,用户可以打开和关闭许多小部件,从而可能增加内存使用。我修复了许多内存漏洞,但在某些情况下,我就是找不到罪魁祸首。堆分析器显示类似于GCRoot[1234]->store.items的内容,我找不到引用存储的代码部分 问题 V8(或任何其他JS引擎)创建新的垃圾收集器根的确切运行时条件是什么?是否有特定的代码模式(闭包、求值、事件列表等)强制它 GC根是一组特殊的对象,垃圾回收器将其用作确定要删除哪些对象的起点 有资格进行垃圾收集一个“根
GCRoot[1234]->store.items的内容,我找不到引用存储的代码部分
问题
V8(或任何其他JS引擎)创建新的垃圾收集器根的确切运行时条件是什么?是否有特定的代码模式(闭包、求值、事件列表等)强制它
GC根是一组特殊的对象,垃圾回收器将其用作确定要删除哪些对象的起点
有资格进行垃圾收集一个“根”只是一个
垃圾收集器假定在默认情况下是可访问的,然后它有自己的
跟踪引用以查找所有其他当前对象
可达成的。无法通过任何引用访问的任何对象
任何根对象的链都被认为是不可访问的,并且将
最终会被垃圾收集器销毁在V8中,根由
当前调用堆栈中对象的数量(即局部变量和
当前执行函数的参数),活动V8句柄
编译缓存中的作用域、全局句柄和对象
通过
问:什么是GC根
答:很多事情:
- 内置对象映射李>
- 符号表李>
- 虚拟机线程堆栈李>
- 编译缓存李>
- 处理范围李>
- 全局句柄
通过我不是javascript内存管理方面的专家,但据我所知:
确保正在清理所有事件处理程序。任何附加到对象/元素的事件处理程序都会使GC难以完成其工作
尽可能使用原型继承:(http://www.crockford.com/javascript/private.html). 它允许对象在内存中引用相同的方法,而不是为每个对象重新创建一个方法-节省内存并提高javascript引擎的性能
Null未使用的任何变量/属性
希望这有帮助我不相信这可以通过V8中的JavaScript实现,这是来自Chrome V8开发者部分:如果一个对象无法通过JavaScript访问,并且没有引用它的句柄,那么它就被视为垃圾。垃圾收集器有时会删除所有被认为是垃圾@Kamyar的对象,当然有一些方法可以通过编写带有引用清理的代码来“帮助”垃圾收集器。例如,var temp=…;/*使用temp*/;温度=零代码>这将确保temp
不会污染相关范围。所以我想知道是否相反:我们可以通过JS用户代码故意创建一个GC根吗?正确。您可以引用空变量或使用delete关键字从堆栈中删除数据,但是您无法确定GC何时开始收集没有句柄的对象,这与.Net或Java不同,后者可以强制GC开始收集孤立对象并回收不可访问的内存,我相信Chrome的设计者选择了不让web开发者开始乱用GC。这是我的两分钱,不过,可能有一些未经记录的方式这样做!我想我可以通过使用源代码找到这些触发器,但是我没有时间去做,我的C++知识相当普通;是的,但是我怎么能从我的代码中分辨出来呢?例如,我可以控制编译吗?VM线程何时启动?