JVM问题排查及常用监控工具
目录
1 CPU高使用问题
1.1 定位问题进程
使用top命令查看资源占用情况,发现pid为3221的进程占用了大量的cpu资源,CPU占用率高达99.7%
1.2 定位问题线程
1.2.1 方法一
使用命令top -H -p pid查看这个进程中,线程占有情况,执行top -H -p 3221,如下
发现线程tpid为3231占用了大量的cpu资源
1.2.2 方法二
使用ps -mp pid -o THREAD,tid,time命令查看该进程的线程情况
1.3 查看问题线程堆栈
1.3.1 导出该进程的线程堆栈信息
在jdk的bin目录下,执行jstack pid >> jstack.txt,将信息导到本地jstack.txt文件
1.3.2 查找高CPU占有率线程堆栈信息
执行cat jstack.txt | grep c9f -A 5,查找线程id为3231的堆栈信息,注意c9f是3232的16进制,-A 5表示显示该行及后5行
由堆栈信息发现线程cpu-test在一直运行,才占有了大量cpu资源,查看程序分析情况
2 常用监控工具
2.1 top命令
查看资源占用情况
2.2 jstack命令
查看线程堆栈信息
命令格式如:
jstack pid | grep tid -A 30 //打印线程堆栈信息
或者
jstack pid >> java.txt //将该进程的线程堆栈信息导到本地文件
2.3 jmap命令
打印java进程的堆内存信息。
2.3.1 java内存模型
Java内存模型是描述Java程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节。
在Java虚拟机中,内存分为三个代:新生代(New)、老生代(Old)、永久代(Perm)。
(1)新生代New:新建的对象都存放这里
(2)老生代Old:存放从新生代New中迁移过来的生命周期较久的对象。新生代New和老生代Old共同组成了堆内存。
(3)永久代Perm:是非堆内存的组成部分。主要存放加载的Class类级对象如class本身,method,field等等。
如果出现java.lang.OutOfMemoryError: Java heap space异常,说明Java虚拟机的堆内存不够。原因有二:
(1)Java虚拟机的堆内存设置不够,可以通过参数-Xms、-Xmx来调整。
(2)代码中创建了大量大对象,并且长时间不能被垃圾收集器收集(存在被引用)。
2.3.2 示例
命令:jmap -histo:live pid
描述:显示堆中对象的统计信息
其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。
[root@localhost bin]# jmap -histo:live 2384 | head -20
num #instances #bytes class name
----------------------------------------------
1: 1048 86768 [C
2: 492 56136 java.lang.Class
3: 529 26320 [Ljava.lang.Object;
4: 10 25024 [B
5: 1035 24840 java.lang.String
6: 79 5688 java.lang.reflect.Field
7: 256 4096 java.lang.Integer
8: 93 3720 java.lang.ref.SoftReference
9: 91 3584 [I
10: 109 3488 java.util.Hashtable$Entry
11: 7 2632 java.lang.Thread
12: 59 2224 [Ljava.lang.String;
13: 38 1824 sun.util.locale.LocaleObjectCache$CacheEntry
14: 55 1760 java.util.concurrent.ConcurrentHashMap$Node
15: 23 1472 java.net.URL
16: 14 1120 java.lang.reflect.Constructor
17: 13 1104 [Ljava.util.HashMap$Node;
2.4 jstat
对Java虚拟机的资源和性能进行实时的监控。
比如 jstat -gcutil : 垃圾回收统计
[root@localhost bin]# jstat -gcutil 2384 2000 10
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 75.83 0.00 17.29 19.76 0 0.000 0 0.000 0.000
0.00 0.00 75.83 0.00 17.29 19.76 0 0.000 0 0.000 0.000
0.00 0.00 75.83 0.00 17.29 19.76 0 0.000 0 0.000 0.000
0.00 0.00 75.83 0.00 17.29 19.76 0 0.000 0 0.000 0.000
0.00 0.00 75.83 0.00 17.29 19.76 0 0.000 0 0.000 0.000
0.00 0.00 75.83 0.00 17.29 19.76 0 0.000 0 0.000 0.000
0.00 0.00 75.83 0.00 17.29 19.76 0 0.000 0 0.000 0.000
0.00 0.00 75.83 0.00 17.29 19.76 0 0.000 0 0.000 0.000
0.00 0.00 75.83 0.00 17.29 19.76 0 0.000 0 0.000 0.000
0.00 0.00 75.83 0.00 17.29 19.76 0 0.000 0 0.000 0.000
S0 :第一幸存区已使用空间百分比.
S1 : 第二幸存区已使用空间百分比
E : 伊甸区已使用空间百分比
O : 老年区已使用空间百分比
M : 元空间使用百分比
CCS : 压缩类空间使用百分比
YGC : 新生代GC次数
FGC : 老年代GC次数
GCT :GC总耗时