深入JVM虚拟机之使用jstat命令摸清线上系统的JVM运行状态
1、对于运行中的系统,想检查JVM中的整体运行情况,最常用的工具就是jstat
2、通过jstat可以查看JVM内部的内存的使用情况,还有GC的执行次数以及耗时
3、通过这些指标,可以判断出系统的当前内存使用压力以及GC压力,内存分配是否合理
新生代对象的增长速度
1、对JVM首先要了解的,就是随着系统的运行,每秒钟会在年轻代的Eedn区分配多少对象
2、 jstat -gc [PID] 1000每隔1秒中执行1次jstat统计
3、举例:第一秒先显示Eden区使用了200MB内存,第二秒显示Eden区使用了205MB内存,第三秒显示Eden区使用了209MB内存,此时你可以轻易的推断出来,这个系统大概每秒钟会新增5MB左右的对象
4、按照上述思路,可以把握线上系统的高峰和日常两个时间段的对象增长速率。
Young GC的触发频率
1、知道新生代对象的增长的速度,很容易推测出来多久发生一次Young GC
2、比如5MB每秒,Eden区一共300MB,则大概1分钟就会Monitor GC一次。
Young GC平均耗时
1、jstat结果显示了系统已经发生饿多少次Young GC以及这些Young GC总耗时
2、比如系统运行24小时后共发生了300次Young GC,总耗时为30s,那么平均下来每次Young GC大概耗时0.1秒的时间,也就是会导致系统停顿0.1秒的时间。
老年代
1、从一个正常的角度来看,来年代扽对象是不太可能不停的快速增长的,因为普通的系统其实没那么多长期存活的对象。
2、如果你发现比如每次Young GC过后,老年代对象都要增长几十MB,那很有可能就是你一次Young GC过后存活的对象太多了。
3、老年代满了会触发Full GC,极度影响程序性能。
Full GC平均耗时
1、Jstat结果中显示系统已经发生了多少次Full GC以及这些Full GC的总耗时。
2、调优 的目的是为了Full GC出现的越少越好。
总结:
1、灵活运行jstat,可以轻而易举掌控线上JVM运行的详细情况
2、针对JVM具体运行情况去进行有针对性的优化。