“如果我们有关于年轻一代的终身对象,年轻的GC变得效率低下”被引用作为支持不可变对象的原因之一。
当收藏家遇到老一代的这样一个对象时究竟会发生什么?
为什么在收集年轻一代的物体时收集较旧的物体会更麻烦?
答案 0 :(得分:3)
为了收集伊甸园空间(年轻一代),任何活动物体都会从伊甸园空间复制到其中一个幸存者空间。已经存在于幸存者空间中的对象将从“从”空间复制到“到”空间,除非它们足够大,可以升级到旧代(在这种情况下,它们会被复制到那里)。
所有这些都涉及对象重定位。为了安全地执行此操作,旧一代中指向新一代对象(在次要GC期间重定位)的任何对象必须更新这些引用。引用重定位对象的对象越多,GC在次要GC期间必须完成的工作就越多。
如果仅使用不可变对象,则将包含来自旧gen的指针的对象数。对年轻一代。将非常小(很可能为零)。这种情况只有两种:
总结答案,通过使用不可变对象,您可以减少GC在次要集合期间必须更新的对象引用数量,从而提高效率。
答案 1 :(得分:-1)
典型的它不能,在收集器考虑收集旧版本中的对象之前,它会促进它在年轻一代无法收获的任何东西,所以当收集者考虑是否可以收集父对象时,它们不再在年轻一代。我认为他们的问题是当它遇到年轻一代的对象时会发生什么,它必须跳过它,并且可以跳过它数百或数千次,因为它是年轻一代的GC之前它必须在老一代做一个
被老一代对象引用意味着它在年轻一代中被有效冻结,被年轻一代对象引用并不是问题,因为年轻一代在开始从老一代收集之前都被解决了。
我认为只要您对取消引用所有未使用的对象都有规定,那么它不会损害您的GC效率,但这可能会在大型应用程序中进行大量额外工作。