您现在的位置:首页 > >

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可以解决这个问题



热文推荐
猜你喜欢
友情链接: