JVM GC遍历一次新生代所有对象是否可达需要多久?

在新生代产生大量对象的情况下,GC遍历所有对象是否可用最大需要多长时间?可依据新生代和不同GC机制举例
关注者
85
被浏览
2291
题主既然没指定“JVM”具体是什么,这里就假设是最常见的情况——HotSpot VM。
请看这个传送门:CMS与mark-sweep/mark-compact/copying GC的关系

HotSpot VM的young gen GC全都使用copying算法,差别只是串行还是并行而已。
Copying GC算法的特征之一就是它的开销只跟活对象的多少(live data set)有关系,而跟它所管理的堆空间的大小没关系。

所以如果题主想像的情况是一个非常大(例如20GB)的young gen,而且应用程序在非常快速的向里面分配新对象,但是这些新对象的绝大部分(例如> 99%)都在下一次young gen GC时已死的话,那其实活对象也没多少(< 204MB),并行处理它们的话或许100-200ms这种范围的时间之内就够了。

而如果场景是一个没多大的young gen(例如2GB),但新生对象几乎全都能活过下一次young gen GC的话,活对象占堆空间的比例很高时copying GC的效率就会很差…此时young gen GC要消耗的时间会远大于前一个场景的。
题主可以自己跑跑例子看这种情况下自己的机器上能跑出怎样的时间。