上篇文章说jmap和jstat的命令,如何查看youngGc和FullGc耗时和次数。
Jmap-JVM(十六)
- Jvm实际运行情况
背景:
机器配置:2核4G
JVM内存大小:2G
系统运行天数:7天
期间发生FULL GC次数和耗时:500多次,200多秒
期间发生Yoing GC次数和耗时:1万多次,500多秒
算下来fullGC平均耗时,0.4s(每次400ms左右)
每天发生1万多次,则每分钟发生1次,每次YoungGC耗费50ms
JVM参数配置:
-Xms1536M -Xmx1536M -Xmn512M -Xss256K -XX:SurvivorRatio=6
-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75 -XX:UseCMSInitiatingOccupancyOnly
通过以上参数我们可以分析出:
- 堆内存是1个G+512M
- 年轻代是512M,老年代是1G
- 因为比例是6:1:1,年轻代eden则是384M,S0和S1分别是64M
- 线程栈256K,元空间256M
前面我们说过,
- 大对象会进入老年代。
- 对象年龄太大会进入老年代。
- 对象动态年龄判断,当进入对象大小大于这块survivor区域的百分之50,会把大于年龄1的对象都放入老年代。
- 老年代分配担保机制:每次minor gc之前都会jvm计算老年代剩余可用空间,如果这个可用空间小于年轻代里现在所有对象大小之和(包括垃圾对象),就会看参数
-XX:HandlerPromotionFailure是否设置。如果没有设置,则直接fullGC,如果fullGC完还不能,则会发生OOM。
如何设置了,则会看老年代可用空间大小是否小于每次minor gc对象平均大小。大于的话才会minor gc。