Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS引擎何时创建垃圾收集根目录? 一点背景_Javascript_V8 - Fatal编程技术网

Javascript JS引擎何时创建垃圾收集根目录? 一点背景

Javascript JS引擎何时创建垃圾收集根目录? 一点背景,javascript,v8,Javascript,V8,我正在用ExtJS3开发一个大规模的JS应用程序。在运行时,用户可以打开和关闭许多小部件,从而可能增加内存使用。我修复了许多内存漏洞,但在某些情况下,我就是找不到罪魁祸首。堆分析器显示类似于GCRoot[1234]->store.items的内容,我找不到引用存储的代码部分 问题 V8(或任何其他JS引擎)创建新的垃圾收集器根的确切运行时条件是什么?是否有特定的代码模式(闭包、求值、事件列表等)强制它 GC根是一组特殊的对象,垃圾回收器将其用作确定要删除哪些对象的起点 有资格进行垃圾收集一个“根

我正在用ExtJS3开发一个大规模的JS应用程序。在运行时,用户可以打开和关闭许多小部件,从而可能增加内存使用。我修复了许多内存漏洞,但在某些情况下,我就是找不到罪魁祸首。堆分析器显示类似于
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线程何时启动?