jstat详细信息,参考:jstat - Java Virtual Machine Statistics Monitoring Tool
1、前文回顾
对象优先在Eden区分配,Young GC的触发时机和执行过程,对象进入老年代的时机,Full GC的触发时机和执行过程
2、功能强大的jstat
可以看到JVM各个区内存使用情况,GC执行次数及耗时,从而可以判断内存使用压力、GC压力、内存分配是否合理
3、jstat -gc PID
jps // 查看java进程的PID
jstat -gc PID
S0C | S1C | S0U | S1U | EC | EU | OC | OU | MC | MU | YGC | YGCT | FGC | FGCT | GCT |
From区大小 | To区大小 | From区已使用 | To区 已使用 | Eden区的大小 | Eden区已使用 | 老年代的大小 | 老年代已使用 | 方法区大小 | 方法区已使用 | Young GC次数 | Young GC的耗时 | Full GC次数 | Full GC的耗时 | 所有GC的总耗时 |
4、其他的jstat命令
参考:jstat命令详解
5、到底该如何使用jstat工具?
分析线上的JVM进程,最想要知道的信息有哪些?如下表
| 对象增长的速率 | 触发频率 | 耗时 | Young GC后 | |
存活 | 进入老年代对象 | ||||
新生代 |
|
|
|
|
|
老年代 |
|
|
| ----------------- | ----------------- |
结合之前的JVM GC优化的方法,合理分配内存。
总体原则:短命对象在新生代被回收,避免进入老年代。长期存活对象早点进入老年代,不要复制来复制去
6、新生代对象增长的速率
对jvm第一个要了解的事:每秒钟会在年轻代的Eden区分配多少对象。jstat -gc PID 1000 10
关注高峰期和非高峰期的增长速率。高峰期可以使用jstat -gc PID 1000 10,非高峰期可以使用:jstat -gc PID 60000 10
7、Young GC的触发频率和每次耗时
对象增长速率知道了,GC的频率其实可以推算出来。
触发频率 = Eden区大小 / 新生代对象增长速率
每次的耗时 = YGCT / YGC
8、每次Young GC后有多少对象是存活和进入老年代
需要推算:每次Young GC后多少对象存活、多少进入老年代。
使用命令:
jstat -gc PID 触发频率 10
观察发生了一次Young GC,此时Eden、Survivor、老年代的对象变化。
Young GC后的Eden区存活 = S区增长 + 老年代的增长,关键观察老年代的对象增长速率。
一般的系统正常情况下,没有那么多存活的对象,即老年代的对象是不太可能不停的快速增长的。
老年代每次都增加几十M情况:
1、存活对象太多触发了动态年龄判断
2、存活对象太多触发了S区放不下
Young GC后的堆存活 = S区存活 + 老年代存活
9、Full GC的触发时机和耗时
Old GC触发频率 = 老年空间/老年代的增长 * YoungGC触发频率
本文是《从 0 开始带你成为JVM实战高手》内容总结,版权问题,特此声明。详细内容:
如果购买,成功后加QQ群找群主返现10元