GC调优的两个原则:
1)将老年代对象数量降至最低
2)减少full GC执行时间
堆内存相关参数
1)-Xms 启用jvm时堆内存大小
2)-Xmx 堆内存最大限制
3)-XX:NewRatio 新生代和老年代的内存比
4)-XX:PermSize -XX:MaxPermSize //设置永久内存以及最大永久内存,只有outOfMemoryError错误才需要调这两个参数
GC分为两种:major GC和minor GC,老年代中采用标记-清除算法的Full GC(或称为Major GC),新生代中采用复制算法的Minor GC。新生代是GC收集垃圾的频繁区域。默认对象在survivor中每熬过15次Minor GC时,就会被晋升到老年代中。这个15是可以配置的。Full GC发生的次数不会有Minor GC那么频繁,并且做一次Full GC要比进行一次Minor GC耗时更长。
各参数建议设定:
1)持久代:一般固定大小为 64m。使用 -XX:PermSize 设置。
2)年轻代:官方建议占整个堆的3/8
3)堆大小: Xmx 和 Xms设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍
4)老年代: 老年代的内存大小设置为老年代存活对象的2-3倍
新生代跟老年代一般内存配比是1:2
-XX:+PrintGCDetails 用于打开GC日志
使用jstat查看老年代内存大小
eden S1区,S0还有一个名字叫from区,默认的是8:1:1
垃圾收集器总结
从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。 Major GC 是清理永久代。Full GC 是清理整个堆空间—包括年轻代和永久代。
java8默认 ParallelGC
新生代收集器:Serial, ParNew, Parallel Scavenge
老年代收集器:Serial Old ,Parallel Old,CMS收集器 (都使用的是标记,删除)
新老代收集器:G1
备注:cms在1.8(不包括1.8)之后将废除,主推G1收集器
Parallel Scavenge收集器
1)高吞吐量为目标,即减少垃圾收集时间(就是每次垃圾收集时间短,但是收集次数多),让用户代码获得更长的运行时间
2)使用的也是多线程复制算法收集
3)收集时会stw
4)可以设置最大gc停顿时间(-XX:MaxGCPauseMills)以及gc时间占比(-XX:GCTimeRatio)
CMS收集器
这是一个以获取最短回收停顿时间为目标的并发收集器。对于重视服务响应时间,希望系统停顿时间尽可能短的,那么CMS就非常符合了。CMS收集器采用标记-清除实现。包括了四个步骤
1)初始标记:简单标记下GC Roots能直接关联到的对象,需要“Stop The World“
2) 并发标记:进行GC Roots Tracing
3)重新标记:修正并发标记期间用户程序继续运行而导致标记发生变动那一部分对 象标记记录,需要“Stop The World“
4)并发清除
相关参数:https://blog.csdn.net/a772304419/article/details/104251642
优点:stw低
缺点:cpu敏感,会影响用户线程相应时间