为什么不可变对象对于分代GC更有效?

时间:2017-08-02 03:27:21

标签: java memory-management garbage-collection immutability

“如果我们有关于年轻一代的终身对象,年轻的GC变得效率低下”被引用作为支持不可变对象的原因之一。

  • 当收藏家遇到老一代的这样一个对象时究竟会发生什么?

  • 为什么在收集年轻一代的物体时收集较旧的物体会更麻烦?

2 个答案:

答案 0 :(得分:3)

为了收集伊甸园空间(年轻一代),任何活动物体都会从伊甸园空间复制到其中一个幸存者空间。已经存在于幸存者空间中的对象将从“从”空间复制到“到”空间,除非它们足够大,可以升级到旧代(在这种情况下,它们会被复制到那里)。

所有这些都涉及对象重定位。为了安全地执行此操作,旧一代中指向新一代对象(在次要GC期间重定位)的任何对象必须更新这些引用。引用重定位对象的对象越多,GC在次要GC期间必须完成的工作就越多。

如果仅使用不可变对象,则将包含来自旧gen的指针的对象数。对年轻一代。将非常小(很可能为零)。这种情况只有两种:

  1. 一个对象被提升为旧的。而它指的是一个物体 仍然处于幸存者的空间。
  2. 一个对象足够大,可以直接在旧代中分配。并且指的是年轻一代中的一个物体。
  3. 总结答案,通过使用不可变对象,您可以减少GC在次要集合期间必须更新的对象引用数量,从而提高效率。

答案 1 :(得分:-1)

  • 收藏家在老一代遇到这样一个对象时到底发生了什么?它是如何处理的?

典型的它不能,在收集器考虑收集旧版本中的对象之前,它会促进它在年轻一代无法收获的任何东西,所以当收集者考虑是否可以收集父对象时,它们不再在年轻一代。我认为他们的问题是当它遇到年轻一​​代的对象时会发生什么,它必须跳过它,并且可以跳过它数百或数千次,因为它是年轻一代的GC之前它必须在老一代做一个

  • 为什么在收集涉及终身一代物品的年轻物体时会更麻烦?

被老一代对象引用意味着它在年轻一代中被有效冻结,被年轻一代对象引用并不是问题,因为年轻一代在开始从老一代收集之前都被解决了。

我认为只要您对取消引用所有未使用的对象都有规定,那么它不会损害您的GC效率,但这可能会在大型应用程序中进行大量额外工作。