当我使用Java CMS垃圾收集器时,我看到它可以调整旧一代的大小,但是似乎很少调整年轻一代的大小。
例如使用标志-Xms10m -Xmx1g XX:+UseConcMarkSweepGC
,我一开始就看到年轻一代大约3M,总大小大约10M:
2018-11-08T15:39:20.620+0100: 0.111: [GC (Allocation Failure) 2018-11-08T15:39:20.620+0100: 0.111: [ParNew: 2733K->320K(3072K), 0.0019042 secs] 2733K->1114K(9920K), 0.0019599 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
但后来的年轻一代仍约为300万,但现在总大小为1.6亿:
2018-11-08T15:39:39.946+0100: 19.437: [GC (Allocation Failure) 2018-11-08T15:39:39.946+0100: 19.437: [ParNew: 2978K->256K(3072K), 0.0020321 secs] 115364K->112701K(159088K), 0.0021039 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
这导致许多小型ParNew GC的性能很差。
在类似的实验中,使用-Xms10m -Xmx12g
,当总堆大小调整为300M时,年轻一代的大小从3M调整为100M。但是,很久以后,总堆大小已调整为11G,但年轻一代仍保持在100M。因此,看来CMS确实可以调整年轻一代的大小,但很少。
有什么方法可以鼓励/迫使CMS收集器在调整年轻一代的大小时对其大小进行调整?由于其他原因(与不知道是否需要大堆有关),我想使初始大小较小。