要摸清JVM的运行状况,最有用的方式之一,就是使用jstat命令。
首先通过jps可以找到你想要的java进程对应的PID,然后执行jstat –gc PID,就可以看到这个Java进程(其实本质是一个JVM)的内存和GC情况了:
运行jstat –gc PID之后,会看到如下列,给大家解释一下:
S0C:这是From Survivor区的大小
S1C:这是To Survivor区的大小
S0U:这是From Survivor区当前使用的内存大小
S1U:这是To Survivor区当前使用的内存大小
EC:这是Eden区的大小
EU:这是Eden区当前使用的内存大小
OC:这是老年代的大小
OU:这是老年代当前使用的内存大小
MC:这是方法区(永久代、元数据区)的大小
MU:这是方法区(永久代、元数据区)的当前使用的内存大小
YGC:这是系统迄今为止的Young GC次数
YGCT:这是系统迄今为止的Young GC的总耗时
FGC:这是系统迄今为止的Full GC次数
FGCT:这是系统迄今为止的Full GC的总耗时
GCT:这是所有GC的总耗时
而且通过jstat –gc PID 1000 10,可以每隔1秒钟更新出来最新的一行的jstat统计信息,一共执行10次:
通过jstat命令我们主要要获取的信息是:新生代对象增长速率,Young GC的触发频率,Young GC的耗时,每次Young GC之后有多少对象是存活下来的,老年代对象的增长速率,Full GC的触发频率,Full GC的耗时。
然后我们根据这些信息,合理分配内存空间,尽可能让对象留在年轻代不进入老年代,避免发生频繁Full GC。这就是对JVM最好的性能优化。
1、新生代对象增长速率:
比如通过jstat –gc PID 1000 10命令,每隔1秒钟更新一次jstat统计信息,比如第一秒显示出来Eden区占用了250M,第二秒显示Eden区占用了255M,第三秒显示Eden区占用了259M,那么就可以大致估算出来Eden区的对象增长速率为:每1秒增长5M。
2、Young GC的触发频率和每次耗时:
还是上面那个例子,比如Eden区总大小为1G,如果每秒新增5M,那么大概200s,也就是说3分20秒就会进行一次Young GC。每次Young GC耗时则可以根据系统迄今为止运行的Young GC次数,以及系统迄今为止Young GC总耗时,计算出来每次Young GC的耗时。
3、每次Young GC后有多少对象是存活和进入老年代:
需要通过监控到多次Young GC,Young GC之后有多少对象放入了Survivor区,老年代又新增了多少对象,来得到老年代对象的增长速率。
4、Full GC的触发频率和耗时:
一旦知道了老年代的增长速率,那么只需要知道老年代的总大小,就可以轻松推测出来Full GC的触发频率。每次Full GC耗时则可以根据系统迄今为止运行的Full GC次数,以及系统迄今为止Full GC总耗时,计算出来每次Full GC的耗时。
1、JVM是如何工作的?_jerry_dyy的博客-优快云博客_jvm是如何运行的
2、JVM的类加载机制_jerry_dyy的博客-优快云博客
3、JVM内存区域划分_jerry_dyy的博客-优快云博客_jvm的内存区域划分
4、JVM垃圾回收机制_jerry_dyy的博客-优快云博客
5、JVM分代模型--新生代 的垃圾回收_jerry_dyy的博客-优快云博客_jvm新生代划分
6、JVM分代模型--老年代 的垃圾回收_jerry_dyy的博客-优快云博客
10、摸清JVM运行状况_jerry_dyy的博客-优快云博客