尝试帮助JavaScript垃圾收集器有意义吗?

尝试帮助JavaScript垃圾收集器有意义吗?,javascript,garbage-collection,Javascript,Garbage Collection,当我像高级面向对象语言一样大量使用JavaScript时,我发现自己像C/C++程序员一样思考,当我完成对象时,我就是这样想的。我知道GC最终会运行并清理我的烂摊子,但我能做些什么来帮助它呢 例如,我有一个大型/复杂的主对象数组。。。每个主对象内部可能都有数组和其他辅助对象引用。如果我处理完一个主要对象并将其从数组中移除,GC可能最终会找出该对象自身指向的所有其他对象,循环内部引用和所有。但是,当从存储阵列中删除主对象以遍历它和阵列时,它是否有意义。length=0 any array和refe

当我像高级面向对象语言一样大量使用JavaScript时,我发现自己像C/C++程序员一样思考,当我完成对象时,我就是这样想的。我知道GC最终会运行并清理我的烂摊子,但我能做些什么来帮助它呢

例如,我有一个大型/复杂的主对象数组。。。每个主对象内部可能都有数组和其他辅助对象引用。如果我处理完一个主要对象并将其从数组中移除,GC可能最终会找出该对象自身指向的所有其他对象,循环内部引用和所有。但是,当从存储阵列中删除主对象以遍历它和阵列时,它是否有意义。length=0 any array和reference=null any objects基本上使GC作业更容易(例如,显式删除引用意味着GC跟踪的对象更少)?如果你愿意的话,这是一种手动析构函数。这样做值得吗?或者我是在浪费时间/精力而得不到什么好处

我想这更像是GC问题的一般理论(Java等),但出于这个问题的目的,我主要对JavaScript感兴趣


谢谢

非常聪明的人在这些垃圾收集模型上付出了很大的努力。您所做的任何事情都比他们所实现的要大幅度提高性能的几率相对较低

如果垃圾收集正在成为您的主要成本,那么您可能最好集中精力减少必须进行垃圾收集的对象的数量(请考虑)

这与从不不同

通常,如果您以合理的方式开发,未使用的对象将适当地超出范围,垃圾收集器将按预期工作。除非您真正了解自己在做什么,否则帮助垃圾收集器完成其工作的努力通常不会如愿。垃圾收集是各种Javascript引擎的创建者进行了重大优化的一个领域。一般来说,除非:

  • 您已经通过分析工具中的硬数字证明了存在 真正的需要,以及
  • 您可以展示对实际需要更改的内容的真正理解 帮助垃圾收集器
这两个目标都不容易实现


因此,最好的答案可能是,除非您已经足够了解异常,否则您可能不应该担心这一点。

这可能取决于特定的垃圾收集器,因此答案将取决于您使用的JavaScript引擎

首先,我要指出,最好的应用程序代码有两个功能。它实现了功能和性能方面的技术目标,并且能够适应变化。额外的代码应该足以证明增加的复杂性

根据Chrome使用的JavaScript引擎

V8可回收存储库中不再需要的对象所使用的内存 这个过程称为垃圾收集。为确保快速分配对象, 垃圾收集暂停时间短,没有内存碎片 雇佣了一个世世代代、精确的垃圾收集器。 这意味着V8:

  • 执行垃圾回收循环时停止程序执行
  • 在大多数垃圾收集周期中,仅处理对象堆的一部分。这将使停止应用程序的影响降至最低
  • 始终准确地知道所有对象和指针在内存中的位置。这样可以避免错误地将对象标识为指针,从而导致 内存泄漏
在V8中,对象堆分为两部分:新空间,其中 对象将被创建,对象将保存到旧空间中 提升了垃圾收集周期。如果一个对象在一个方向上移动 垃圾收集周期,V8更新指向对象的所有指针

分代垃圾收集器倾向于在堆之间移动对象,其中所有活动对象都移动到目标堆中。任何未移动到目的地的内容都被视为垃圾。目前还不清楚V8垃圾收集器是如何识别活动对象的,但我们可以从其他一些GC实现中寻找线索

作为一个记录良好的GC实现行为示例,Java的并发标记扫描收集器:

  • 停止应用程序
  • 生成可从应用程序代码访问的对象列表
  • 恢复应用程序。同时,CMS收集器运行一个“标记”阶段,在该阶段中,它将可传递访问的对象标记为“非垃圾”。由于这与程序执行并行,因此它还跟踪应用程序所做的引用更改
  • 停止应用程序
  • 运行第二个(“备注”)阶段以标记新可访问的对象
  • 恢复应用程序。并行地,它“清理”所有标识为垃圾的对象并回收堆块
  • 它基本上是一个图遍历,从一组特定的节点开始。由于无法访问断开连接的对象,因此它们与其他断开连接的对象的连接不应发挥作用

    关于Java垃圾收集的工作方式,有一份很好的白皮书,尽管有些过时。垃圾收集并不是Java独有的,所以我怀疑Java虚拟机和其他运行时(如JavaScript引擎)所采用的各种方法之间有一些相似之处

    雷蒙德·陈(Raymond Chen)在一篇文章中指出,你即将释放的行走记忆会对表现产生负面影响。上下文是关于在应用程序关闭时手动释放内存。由于块可能已交换到磁盘,因此遍历引用的行为可能导致这些块被交换到磁盘中。在这种情况下,程序正在执行