JVM实战调优
Contents
JVM调优
选择合适的垃圾回收器
单线程或者2个CPU的就用serial
网站类要求最小STW的 CMS,计算类吞吐量用 Paralie
设置合适的各个代取的大小和ratio
- 默认YGC 15次之后的对象进入老年代,可以修改
- 默认堆区最大值是操作系统内存的1/4,可以修改并且设置初始值和最大值
垃圾回收算法的调整
CMS是标记清除的可能有碎片,设置参数FGC后压缩一次
FULL GC触发的可能情况和解决方案
System.gc()
建议JVM Full GC,但是尽量不使用此方法,让虚拟机自己去管理它的内存,可通过通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。
老年代代空间不足:
- 新生代产生的新对象进入老年代,老年代实际空间已经满了,触发FULL GC,最常见的情况
- 老年代采用CMS,虽然空间还有,但是都是空间碎片,不足以装下一个大的对象,也会触发FULL GC。解决方案:设置合适的参数,每多少次FULL GC进行一次压缩
永久代空间不足(1.8JDK不存在)
当系统中要加载的类、反射的类、CGLIB的类和调用的方法较多时,Permanet Generation可能会被占满,解决方案增大Perm Gen空间
CMS GC时出现promotion failed
CMS因为是并发清楚,所以Full GC进行时有很多对象进入老年代而空间又不组会触发,serialOld的方式单线程回收,STW时间长。解决方案,调大老年代的剩余空间比例
统计Minor GC后进入老年代的平均大小大于老年代的可用内存
比如第一次YGC有6M对象进入老年代,则第二次出发YGC时会检查老年代剩余空间是否大于6M,否则进行FULL GC,虽然这一次YGC的产生对象也不一定有6M
频繁FULL GC报警的应对措施
https://blog.csdn.net/wilsonpeng3/article/details/70064336
- 利用工具检测各个带区的空间变化情况:Jconsole工具、jstat -gc -utilgc -capacity,来缩小问题的范围
- 锁定范围时,通过 jmap -dump生成dump包,或者设置参数每次FULLGC之前生成dump包,再利用工具查看内存快照中对象情况,定位问题
- 查看GC日志,获取更多的信息