JVM调优案例详解及面试题
JVM调优目的
减少STW (Stop The Work),减少full gc的次数和缩短full gc的时间 一个4核8G的订单系统,假设给JVM运行内存为3个G,按照上图比例老年代可分2G, Eden 800M,S0,S1各100M,线程运行每秒产生60M对象,大概运行13秒就会占满Eden区, 前12秒产生的对象在做一个minor gc后被当作垃圾对象处理掉,第13秒产生的对象不是垃圾对象, 会被放到S0区 第13秒产生的60M对象大于S0区的50%会被放到老年代old,参考如下1.4对象动态年龄判断, 因此每隔13秒会有60M对象会被放到老年代old,大概7到8分钟就会放满老年代, 老年代放满后就会产生一次full gc,此时老年代里99%的对象是垃圾对象,会被清理掉 而一次full gc,会收集整个堆的垃圾对象,时间过长,而JVM调优的目的就是减少fullgc次数
面试题
能否对JVM调优,让其几乎不发生full gc?
答:能,如下图,当我们增加年轻代的内存(Eden,S0,S1)时, 线程运行每秒产生60M对象,大概运行25秒 就会占满Eden区,此时前24秒产生的对象在做一个minor gc后被当作垃圾对象销毁掉,第25秒产生的对象 会被放到S0区,第25秒产生的60M对象小于S0区的50%不会被放到老年代,当Eden再一次放满, 此时minor gc会销毁Eden中前24秒的垃圾对象和S0中的对象,Eden第25秒产生的对象会被放到S1区, 当Eden再一次放满,参考以上说明minor gc会销毁Eden中前24秒的垃圾对象和S1中的对象, Eden第25秒产生的对象会被放到S0区,如此流转处理,让其几乎不发生full gc
总结:增大年轻代的内存,即调整Xmn的大小为2048m可以解决这个问题