0%

Java 查看系统GC命令介绍

前言

使用 JVM的人都或多或少的了解垃圾回收机制,当系统的服务出现性能问题时,都会去服务器上查看下系统GC的情况。此外,如果有新的服务上线,也需要去服务器上查看下新服务的整体GC水平,这就可以使用jstat命令来查看了,当然你也可以使用其他方式。

Jstat 查看系统 GC 命令介绍

jstat的命令查看系统GC情况,很简单,只需要先通过jps或者ps -aux |grep tomcat来查看对应服务所在的进程数,然后使用下面命令查看。

jstat 查看 gc 使用方法如下:

1
2

jstat -gcutil `线程值` `间隔时间数(ms)`

执行命令sudo jstat -gcutil 11694 3600,结果会显示内存各个区域大小的情况,如图:

Note: 结果里面列出每个区间的内存大小,新生代gc的次数和时间,老年代gc的次数和时间。

1. S0  — Heap上的 Survivor space 0 区已使用空间的百分比;
2. S1  — Heap上的 Survivor space 1 区已使用空间的百分比;
3. E   — Heap上的 Eden space 区已使用空间的百分比;
4. O   — Heap上的 Old space 区已使用空间的百分比;
5. P   — Perm space 区已使用空间的百分比;
6. YGC — 从应用程序启动到采样时发生 Young GC 的次数;
7. YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒);
8. FGC — 从应用程序启动到采样时发生 Full GC 的次数;
9. FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒);
10. GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒).

Jmap 查看系统 GC 命令介绍

当我们使用jstat命令查看GC时,发现YoungGC或者FullGC频率过高时,就需要分析服务的具体情况了。这个时候,可以使用Jmap来查看当前系统的实例使用内存大小,一般地,需要dump到本地进行分析,使用可视化工具可以使分析效率得到很大的提高。

Jmap的使用方法如下所示:

1
jmap -dump:format=b,file=log.bin `进程id`    

使用sudo jmap -dump:format=b,file=log.bin -F 11694命令,写入文件内容如下:

JAVA PROFILE 1.0.1
JAVA PROFILE 1.0.1
Lcom/alibaba/dubbo/remoting/exchange/support/DefaultFuture$RemotingInvocationTimeoutScan;
DefaultStatistics.java
T8procedureNameRs
StringUtils.10
isCons
(Ljava/lang/Integer;)Ljava/math/BigDecimal;
HtheCloseBracketFor
h([Ljava/lang/String;Lorg/codehaus/jackson/JsonGenerator;Lorg/codehaus/jackson/map/SerializerProvider;Lorg/codehaus/jackson/map/JsonSerializer;)V
zC@roureq
lastActiveFilter
Ampersand
......

Note:有很多可视化的工具来分析dump文件,为了简单,这里使用java自带的工具jvisualvm工具,在文件选项中装入 dump 下来的 文件log.bin,就可以看到各个对象实例所占用的内存大小和实例数量了。如下图:

小结

java 中 还有一个命令比较有用,就是jstack,该命令可以查看服务器上的某个服务的堆栈信息。从而分析线程是否处于死锁状态,从而导致服务不可用或者服务性能受到影响。使用命令jstack 线程id就可以获取所有堆栈信息了,非常简单便捷。