通过了这个link但仍然
混淆了主要和次要GC收集中实际发生的情况。

假设我在年轻一代中有100个对象,其中85个对象是无法到达的对象。现在,当次要GC运行时,
它将回收85个对象的内存,并将15个对象移动到较老的(使用期限)的对象。

现在,较早的一代中存在15个 Activity 对象,其中3个是无法访问的。说重大GC发生了。它将保持
照原样保留15个对象,并回收3个无法访问的对象的内存。据说主要GC的速度比次要GC的慢。 My question is why ? Is it because of major GC happens on generally greater number of objects than minor as minor gc occurs more frequently than major?
根据理解major GC should be faster as it needs to do less work,即从次要GC中回收无法访问的对象的内存,因为
年轻一代的死亡率很高。

最佳答案

1)次要GC将首先将15个对象移动到幸存者空间之一,例如SS1,下一个GC将仍然存在的对象移动到SS2,接下来GC将幸存的对象移动回到SS1,依此类推。只有在几个(例如8个)重定位(次要GC)中幸存下来的人才能最终成为老一代。

2)仅当JVM由于其中没有可用空间而无法在旧版本中分配对象时,才会发生主要GC。要清除死对象的内存,GC会覆盖旧一代中的所有对象,因为旧一代的体积是新一代的几倍,因此它可能容纳更多的对象,因此GC处理将花费更长的时间

关于java - 为什么“大垃圾收集”的速度比“小垃圾收集”的速度慢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24592834/

10-09 03:20