有哪些方法可以防止Javascript gc尽可能少地运行?

有哪些方法可以防止Javascript gc尽可能少地运行?,javascript,memory-management,garbage-collection,v8,Javascript,Memory Management,Garbage Collection,V8,我正在学习Javascript,在各种文本中,作者将谈到Javascript使用标记和扫描gc从内存中释放对象。他们还将谈到如果您将变量引用的值设置为null,它将删除对该值的引用,从而允许为gc设置分配的空间。表示可以通过将变量包含的值设置为null,然后设置为undefined来删除已分配的内存和引用,如果我理解正确,可以有效地从堆中删除已分配的空间 所以我的问题是:有没有可能以一种可以消除gc的方式编写javascript 如果它是特定于实现的,我想知道它在v8上是否可行,但在rhino或

我正在学习Javascript,在各种文本中,作者将谈到Javascript使用标记和扫描gc从内存中释放对象。他们还将谈到如果您将变量引用的值设置为null,它将删除对该值的引用,从而允许为gc设置分配的空间。表示可以通过将变量包含的值设置为null,然后设置为undefined来删除已分配的内存和引用,如果我理解正确,可以有效地从堆中删除已分配的空间

所以我的问题是:有没有可能以一种可以消除gc的方式编写javascript

如果它是特定于实现的,我想知道它在v8上是否可行,但在rhino或其他js实现上是否可行,这也会非常有用

从像我这样的项目来看,我的请求并不太不合理,但我不完全确定内存模块是如何做到这一点的

我总是觉得如果我解释一下我为什么要问这个问题会很有帮助。我非常喜欢编译器,我想写一个compiletojs语言,它利用了一个类似于的静态推断类型系统。我之所以想写我自己的,是因为我想利用区域推断来确定对象和变量何时尽可能多地超出范围,并在离开范围时将其从堆中移除,从而尽可能地消除gc。这主要是一个研究项目:因为我可以这样做,所以任何关于javascript内存优化的资源都将非常感谢

编辑:我想另一种表达方式是,是否有可能以这样一种方式编写js,即gc肯定不会尽可能多地运行?如果是的话,将涉及哪些技术

我并不是在寻找delete,因为它标记了要删除的元素,从而调用了我想要尝试避免的内容。我很好奇,如果我删除了所有引用和与变量关联的值,实现的gc是否会运行

或者,从参考SO答案中释义:

x=foo; x=零; x;


x还在堆上吗?

还不完全清楚您在寻找什么

标准Javascript实现无法手动释放内存。可以使用delete操作符删除属性,但这只是从对象中删除属性。如果没有对该数据的其他引用,它甚至不会释放属性指向的、留给垃圾收集的任何内容

Javascript从一开始就被设计成一种垃圾收集语言。只有当垃圾回收器运行并且垃圾回收器发现无法访问的对象(例如,没有对仍在使用的对象的引用)时,才会从物理内存中释放内容。该语言不包含释放内存的命令

在一些JS实现中,您可以自己调用GC,而不是等待JS引擎运行它,但它仍然使用GC来决定释放什么

回应你在答案中添加的其他内容

据我所知,javascript只在GC运行时进行清理。在此之前,对象被标记,以便GC可以看到在任何地方都没有对它们的引用,但在GC检查并注意到这一点之前,它们实际上不会被释放。此外,函数作用域中的局部变量本身就是一种对象类型,在GC运行并注意到JS中没有对函数作用域的引用之前,这些变量不会被释放,即使在函数完成之后,闭包也可以维护对函数作用域的引用

因此,在您的代码示例中:

x = foo; x = null; x;
x仍然存在并占用了一些空间,因为它仍然在范围内,代码仍然可以到达它。它的内容将为null,这可能不会占用变量本身以外的额外空间,但是在垃圾收集器发现它所在的函数上下文没有引用之前,不会释放变量本身的空间


JS是一种垃圾收集语言。这就是实际从堆中释放内容的时间。该语言中没有任何指令可用于更快地释放内容。

删除关键字将触发浏览器的垃圾收集。请注意,除非将对象引用置零,否则它将删除整个对象链

var o = {...};

delete o;

所以,换句话说,如果找不到对该对象的其他引用,则使用delete和GC释放内存。因此,程序员有可能释放对象,这实际上会导致释放内存。@JaniHyytiäinen-不太可能。delete运算符仅用于从对象中删除属性或将数组元素恢复为未定义状态。delete对变量没有任何作用。对于这些,可以将它们设置为null或undefined。如果你想理解删除,你可以阅读。这是可能的
javascript开发人员可以删除对对象的引用。如果没有对该对象的其他引用,GC将清理它。@pensivearchitect-我在回答中添加了一些注释。请查看是否要阅读如何使用delete。它主要用于从对象中删除属性。而且,使用它不会触发垃圾收集,这是一篇很棒的博文,jfriend00。不过,我在帖子中没有看到这与垃圾收集有什么联系。我以前写过代码,删除了一个对象的属性,该属性本身引用了许多其他对象,我注意到浏览器中有一个轻微的停顿。这让我觉得垃圾收集器开始检查被删除的对象,以便释放内存和处理器使用率的峰值。然而,我从未找到任何证据支持这一点。只是传闻啊,真奇怪。。。我刚才给你这个链接是因为你的答案使用了delete操作符。当GC运行完全依赖于实现,并且在不同的浏览器中会有所不同时,它不是任何标准文档的主题。JS引擎通常会将GC延迟到当前执行线程完成为止,这样它们就可以避免干扰运行时性能,并且可以对上次运行的代码的所有更改进行一次扫描,而不是多次扫描。但是,在执行过程中,他们肯定会运行某些东西。