关于垃圾收集内部的一些问题?

时间:2014-07-06 02:48:54

标签: java garbage-collection

我试图了解垃圾收集过程的工作原理。碰到好link。 大多数文章说,在较小的GC收集过程中,对象从伊甸园迁移到幸存者空间,并在主要的GC收集过程中 对象从幸存者移动到终身空间,否则回收所有无法到达的对象内存。我有三个问题(需要问一下 基于上述陈述,单独行动: -

1)Minor vs Major GC collection ? What is the difference between two that one is called major and other is called minor collection? 根据我的理解,在次要收集过程中,与主要收集应用程序运行时并行运行 在那段时间暂停。

2)What actually happens when object is moved from eden to survivor space ? Does the memory location of object is changed internally?

3)Why not just one space exist instead of three i.e eden, survivor and tenured space exist ?我知道背后必须有一个理由,但我错过了它。 我的观点是当GC运行时,收集无法到达的对象并仅在该空间中留下可到达的对象。只有一个空间似乎就足够了。那三种不同有什么优势 空间证明了一个?

2 个答案:

答案 0 :(得分:3)

1)新一代发生次要GC,老一代发生主要GC。它是否与应用程序并行取决于GC的类型,只有CMS和G1可以同时工作

2)是的,在GC期间移动对象会更改其物理位置,因此所有指向此对象的指针都将更新

3)这是为了避免GC期间经常和长时间的应用冻结。如果它是一个大堆,那么应用程序通常会长时间冻结。 JVM在年轻一代中创建对象,其中的GC经常发生但很快。 JVM创建的大多数对象都很快就会死掉,而且它们永远不会老化,所以主要的GC会发生很多事情,或者根本不会发生。

答案 1 :(得分:1)

我的答案来源是this Oracle article on GC basics,因此这些答案适用于HotSpot。没有关于其他虚拟机的线索,虽然我猜想如果在其他虚拟机中使用相同的实现技术,一般的想法可能会保持不变。

  

次要与主要GC收集?两个被称为主要和其他被称为次要集合的区别是什么?

次要GC是年轻一代的GC,其中分配了新对象。主要的GC是所有活动对象的GC,包括永久性的一代(这对我来说有点兴趣,但这正是文章所说的)。此外,似乎 主要和次要GC都是世界各地的事件。

  

当物体从伊甸园移到幸存者空间时会发生什么?对象的内存位置是否在内部更改?

我现在似乎无法找到参考,但我会这么认为。允许更改内存位置可以执行压缩,从而提高内存分配性能并简化操作。允许每个空间单独压缩是有意义的,所以我猜想将对象从堆的一部分移动到另一部分会涉及将对象从一个内存位置物理移动到另一个内存位置。

  

为什么不存在一个空间而不是三个空间(即伊甸园,幸存者和终身空间)?

简答:效率。如果你只有一个空间,你必须在GC时检查所有对象,如果你有很多长寿命的对象就会效率低下(并且你几乎可以保证长时间有一个合适的数字) - 运行应用程序),因为这些长寿命对象可能仍然可以从一个GC到达下一个GC。拆分堆允许对GC进行优化,因为大多数GC工作可以集中在可以假设对象寿命较短(即年轻代)的情况下,较长寿命的对象在GC中的频率较低。