繁体   English   中英

为什么主要垃圾收集比次要慢?

[英]Why Major Garbage collection is slower than Minor?

通过此链接已经消失但仍然混淆了小型和主要GC集合中实际发生的情况。

假设我有年轻一代的100个对象,其中85个对象是无法访问的对象。 现在,当Minor GC运行时,它将回收85个对象的内存并将15个对象移动到较旧(终身)代。

现在有15个活动对象存在于老一代中,其中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个)重新安置(小型GCs)的人才能最终进入老一代。

2)仅当JVM无法在旧代中分配对象时才会发生主要GC,因为其中没有可用空间。 为了清除死机中的内存,GC遍历旧一代的所有对象,因为旧一代比新一代大几倍,它可能容纳数倍的对象,因此GC处理需要几倍的时间

我的问题是为什么? 是因为主要的GC发生在通常更多的对象上而不是次要的,因为较小的gc比主要的更频繁出现?

你几乎击中了它的头。 从Oracle文章中强调我的:

通常,主要集合会慢得多,因为它涉及所有活动对象

因此,一个主要的GC不仅分析了旧一代中的这15个对象,它还经历了年轻一代(再次)和permgen和GC这些堆的区域。 次要GC仅分析年轻一代,因此通常不会有太多的对象需要查看。

根据理解,主要GC应该更快,因为它需要做的工作少(即从无法到达的对象回收内存)而不是次要GC因为年轻一代的高死亡率。

我想我明白你为什么这么想。 我可以想象,在一个次要的GC之后很快就可以运行主要的GC,当时对象被提升到几乎完全老一代。 因此,年轻一代(可能)不会包含太多要收集的物品。

但是,如果我正确地记住了事情,老一代通常比年轻一代更大,所以GC不仅需要分析更多空间,还必须重新审视permgen,以及其余的对象。年轻一代(再次)。 这可能就是为什么主要的GC速度较慢的原因 - 仅仅因为有更多的东西要做。 可以通过更改生成空间的大小来使主要GC比次要GC更快,这样年轻一代比老一代和permgen都要大,但我认为这不是一个常用的设置。 ..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM