2017-08-02 51 views
2

“年轻的GC变得效率低下,如果我们有年龄更大的持久对象”被引用为赞成不变对象的原因之一。为什么不可变对象更适合分代GC?

  • 收集器在老一代遇到这样的对象时究竟发生了什么?

  • 为什么要在年轻一代中收集一个指向对象的旧对象比较麻烦?

回答

2

要收集伊甸园空间(年轻的gen),任何活的物体从伊甸园空间复制到其中一个幸存者空间。已经存在于幸存者空间中的物体会从“发”空间复制到“收”空间,除非它们的年龄足以提升到老一代(在这种情况下,它们将在那里被复制)。

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

如果仅使用不可变对象,将包含来自旧gen指针的对象数。到了年轻的一代。将会非常小(很可能为零)。只有两种方式可能发生:

  1. 一个对象被提升为旧有的。而它所指的对象 仍处于幸存者空间。
  2. 一个对象足够大,可以直接在旧代码中分配。并且指的是年轻族中的一个物体。

总结答案,使用不可变对象你减少了GC有一个小的收集过程中更新对象引用的可能数目,因此提高了效率。

+0

为什么参考文献需要更新?从伊甸园复制到幸存者是否涉及对象回收? – IUnknown

+0

如果对象A是指对象B并且对象B被重新定位(从伊甸园到幸存者,幸存者到旧的幸存者或幸存者),则对象A中的引用必须更新。一旦先前被对象B占用的内存区域被重用,对象A中的引用将会完全不同。 – Speakjava

-1
  • 当集电极遇到这样的对象在老一代究竟会发生什么?它是怎样处理的呢?

典型的不能,集电极认为老一辈收集对象能促进东西它不能在年轻一代中收获之前,所以由收藏家考虑时间,如果父对象可以收集他们是没有更年轻的一代。我认为他们的问题是在年轻一代遇到问题时会发生什么,它必须跳过它,并且可能会像年轻一代GC那样跳过它几百或几千次,之后才会对老一代做一件事。

  • 为什么要收集一个年龄较大的对象,指的是年老一代中的一个对象呢?

正由老一代对象引用意味着它有效地冻结在年轻一代,通过年轻一代被引用的对象没有问题,因为它开始从老一辈收集前的年轻一代都解决了。

我认为只要你对所有未使用的对象进行解引用,那么它不会损害你的GC效率,但这可能是一个大型应用程序中的大量额外工作。

相关问题