如何知道新生代对象增长速率
Linux中输入命令jstat –gc PID 1000 10,可观察10次,每次间隔一秒,eden区增长情况,显示的数据中内存相关的单位是kb,时间的单位是秒
young gc触发频率及每次平均耗时
eden区大小除以新生代对象增长速率,即可知多久触发一次young gc。
jstat –gc PID命令可知系统迄今为止young gc的总次数YGC,以及young gc的总耗时 YGCT,相除即可得平均耗时
每次young gc后存活对象平均有多少
知道了young gc频率,再使用命令jstat –gc PID young gc周期 统计次数,可得每次young gc后eden,survivor,老年代的内存变化,即可算出young gc后平均存活对象大小,和老年代的增长速率
Full gc的触发频率与平均耗时
根据上一条可计算出老年代中对象的增长速率,再用老年代的大小除以增长速率,即可知平均多久触发一次full gc
jstat –gc PID命令可知系统迄今为止full gc的总次数FGC,以及full gc的总耗时FGCT,相除即可得平均耗时
如果只是观察jvm的运行情况,进行jvm 的gc优化,jstat够用,但有时新增对象太快,想看看到底哪些对象占据了主角,占用了多少内存,jmap和jhat可以观察到线上jvm中对象的分布。jmap –histo PID可以查看对象占用内存排序,降序排序
如何生成对象占用快照
jmap –dump:live,format=b,file=dump.hprof PID
如何分析快照
jhat dump.hprof –port 7000
预估性优化
系统开发完毕之后,自行估算系统每秒大概多少请求,每个请求会创建多少对象,占用多少内存,机器应该选用什么样的配 置,年轻代应该给多少内存,Young GC触发的频率,对象进入老年代的速率,老年代应该给多少内存,Full GC触发的频率。这些东西其实是可以根据你自己写的代码,大致合理的预估一下的。在预估完成之后,就可以采用之前多个案例介绍的优化思路,先给自己的系统设置一些初始性的JVM参数 比如堆内存大小,年轻代大小,Eden和Survivor的比例,老年代的大小,大对象的阈值,大龄对象进入老年代的阈值,等等。优化思路其实简单来说就一句话:尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留存在年轻代里。尽量别让对象 进入老年代。尽量减少Full GC的频率,避免频繁Full GC对JV