理解Throughput收集器
Throughput收集器在Minor GC或者Full GC时,应用线程都会暂停。
Throughput垃圾回收 - Minor GC.png
在Eden空间将用尽时,触发Minor GC,一部分对象移动到Survivor空间,其他的被移动到老年代。注意在Survivor中,在下一次Mino GC会将存活对象复制送入到另一块Survivor space,S0和S1角色交换,保证存活对象占用连续的内存空间,避免了碎片化的发生。
Throughput垃圾回收 - Full GC.pngFull GC会回收所有新生代包括Suvivor空间中所有的对象,只有有活跃引用的对象或者经过压缩整理的对象会在老年代中继续保存。
堆大小自适应调整
对任何一种应用,都可以通过实验确定堆和代的最佳大小,但是让JVM自己来选择是最容易的方法,而默认情况下自适应调整就是开启的。
有两个性能指标::-XX:MaxGCPauseMillis=N -XX:GCTimeRatio=N
- MaxGCPauseMillis 标志用于设定应用可承受的最大停顿时间,这个标志设定的值同时影响Minor GC 和Full GC。如果设置的值非常小,那么应用的老年代最终就会非常小,将频繁的触发Full GC。
- GCTimeRatio 标志可以设置你希望应用程序在垃圾回收上花费多少时间,它的值是一个百分比,默认值是99,将N值代入带如下公式可以计算出理想情况下应用线程的运行时间所占的百分比:
ThroughputGoal = 1 - 1 / (1 + GCTimeRatio)
GCTimeRatio是99,代入公式可得0.99,即期望应用程序在运行时间上占总时间的99%,只有1%的时间消耗在垃圾回收。
如果同时都设置了这两个标志,MaxGCPauseMillis拥有最高的优先级,设置了MaxGCPauseMillis 标志后,新生代和老年代的大小会随之调整,知道满足对应目标停顿时间,一旦MaxGCPauseMillis目标达成,堆的总容量就开始逐渐调整,直到运行时间的比率达到设定值,这两个目标都达成后,JVM 会尝试缩减堆的大小,尽可能以最小的堆大小来满足这两个目标。
网友评论