首页 > 代码库 > jstat简单使用操作记录

jstat简单使用操作记录

JVM调优接触不多,这边只是简单使用jstat命令观测Java堆内存垃圾回收情况。
简单处理过程为:

1、先获取到pid

先获取到pid,通过命令:
ps -ef|grep xxx-service-name
或者可以采用jps -vl或者jps -l命令查看pid

2、查看内存/GC情况

jstat命令查看,jstat是jdk自带的一个轻量级小工具
全称为:Java Virtual Machine statistics monitoring tool。
jstat -gcutil pid #统计heap的gc情况
jstat -gcutil -t pid 250 5 #250毫秒采样5次
jstat -gc -t pid 250 5

更细的监控命令还有:
jstat -gcnew pid 统计新生代的gc情况
jstat -gcold pid 统计老年代的gc情况
jstat -gccapacity pid 统计不同的generations新生代、老生代、永久代相应的heap容量信息
jstat -gccause pid 统计gc的情况以及引起gc的事情,同-gcutil

[java@s2_xx xxx-service-name]$ jstat -gcutil 10500
S0 S1 E O P YGC YGCT FGC FGCT GCT
40.13 0.00 66.98 8.98 63.72 10 0.271 0 0.000 0.271

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

jstat -gcutil -h10 -t 10500 250 30 #每隔10行输出一次列表头

[java@s2_xx xxx-service-name]$ jstat -gcnew 10500
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
41792.0 40320.0 9376.9 0.0 1 15 40320.0 180032.0 55208.5 24 0.531

S0C 分配S0区42M内存大小
S1C 分配S1区40M内存大小
S0U S0区已经使用的内存大小,9M左右
S1U S1区已经使用的内存大小,0M
TT tenuring threshold阀值,用于控制对象在新生代存活的最大次数
DSS desired survicor size

3、dump到本地分析是否有内存泄露

借助jmap命令即可
jmap -dump:format=b,file=/tmp/heap.bin pid
dump文件最好在FGC时候处理,如果可以的话,这样可以更加准确发现问题。

然后在本地用mat分析即可
Eclipse mat,下载地址为:http://www.eclipse.org/mat/

另外判断是否有死循环、死锁等问题,可以通过jstack命令观察。

附加补充:

1 JVM内存大致划分
JVM堆内存=新生代+老年代+持久代
新生代=S0+S1+Eden区
老年代为Old space
持久代为Perm space
2 机器配置查看
s2-xf为centos Linux64位 16核 32G内存设备。
cat /proc/version 查看操作系统版本
cat /proc/cpuinfo 查看cpu信息
free 查看内存信息
cat /proc/meminfo 查看系统内存信息