通过这个链接,但仍然有混乱的实际发生在次要的和主要的GC集合。
假设我在年轻一代中有100个对象,其中85个对象是无法到达的对象。现在,当运行较小的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,因为年轻一代的死亡率很高。
发布于 2014-07-06 05:18:23
1)小GC首先将15个对象移动到幸存者空间中的一个空间,如SS1,下一个GC将移动那些仍然活着的对象到SS2,下一个GC将把那些幸存下来的移回SS1等等。只有那些幸存了几次(如8次)搬迁(小GCs)的人,才会最终属于老一代。
2)只有当JVM无法在旧一代中分配对象时,才会发生主要GC,因为对象中没有可用的空间。为了从死对象中清除内存,GC会遍历旧代中的所有对象,因为老一代比新一代大好几倍,所以GC处理需要的时间要长好几倍。
发布于 2014-07-06 05:20:21
我的问题是为什么?这是因为主要GC通常发生在更多的对象上而不是次要的对象上,因为次要gc发生的频率比minor更频繁吗?
你几乎把钉子打在头上了。在Oracle的文章中,强调我的观点:
通常,主要集合的速度要慢得多,因为它涉及、所有活动对象。
因此,一个主要的GC不仅分析了老一代中的这15个对象,而且还经历了年轻一代(同样)以及permgen和GCs --堆中的这些区域。小GC只分析年轻一代,因此通常不会有那么多对象可查看。
据了解,主要GC应该比小GC更快,因为它需要做更少的工作(即从无法到达的对象回收内存),因为年轻一代的死亡率很高。
我想我理解你为什么这么想。我可以想象,当对象被提升到几乎满是老一代的时候,主GC很快就会在一个小GC之后运行。因此,年轻一代(想必)将不会有太多的物品可供收集。
但是,如果我没记错的话,老一代通常比年轻一代要大,所以GC不仅要分析更多的空间,还必须再次遍历permgen,以及年轻一代中的剩余对象(再次)。所以这可能就是为什么主要的GC要慢一些--仅仅是因为有更多的事情要做。您可能可以通过更改生成空间的大小来使主GC比小GC更快,这样年轻一代比上一代和permgen都大,但我认为这不是一个常用的设置.
https://stackoverflow.com/questions/24592834
复制相似问题