1.JVM调优的两个指标:吞吐量,停顿时间
停顿时间:简单理解为STW的时间,此时用户代码不会执行。
吞吐量:运行用户代码时间/(运行用户代码时间 + 运行垃圾收集器的时间)
这两者是矛盾的,选择了停顿时间意味着要牺牲了吞吐量,选择了吞吐量意味着要牺牲停顿时间。根据具体的业务场景,选择优先停顿时间还是优先吞吐量。
2.G1的参数设置:
-XX:+UseG1GC 开启G1
-Xms2G -Xmx2G 设置堆的大小,G1一半不需要手动设置eden和survivor的大小,G1自己动态调整
-Xss256K 可以设置虚拟机栈的大小
-XX:MaxGCPaustMillis=300 最大停顿时间,默认值是200
3.G1回收过程:
G1回收经历了Minor GC ——> Mixed GC——>Full GC
1) Minor GC:
触发条件:新生代(即Eden + Survivor)占据整个堆大小的60%时,触发Minor GC
晋升条件:对象age超过阈值15,Eden存活对象 + from对象的大小超过50%时,age最大的对象进入老年代
2) Mixed GC:
触发条件:老年代超过堆的45%
回收经历了初始标记——>并发标记——>最终标记——>筛选回收几个过程。初始标记只会标记GCRoot和第一层对象,耗时较短, 耗时最长的并发标记使用多线程进行,目的还是减少STW的时间。最终标记就来修正初始标记后新产生的垃圾。
3) Full GC:
使用标记整理算法,在设置的停顿时间内,选择小于10%的垃圾最多的区域进行回收,回收后检查老年代大小是否小于45%,如果还超过就重复操作,8次后还不满足老年代小于45%,就会执行Full GC。
4.G1的适用场景:
适用内存大时,内存大时如果发生FullGC,会回收整个老年代,由于老年代空间较大,回收耗时很长,无法接口。而G1可以只回收部分垃圾最多的空间,所以可以很好的控制停顿时间。