您的位置:首页 > 运维架构

JVM问题排查及常用监控工具

2018-11-30 15:13 267 查看

JVM问题排查及常用监控工具

目录

1 CPU高使用问题

1.1 定位问题进程

1.2 定位问题线程

1.2.1 方法一

1.2.2 方法二

1.3 查看问题线程堆栈

1.3.1 导出该进程的线程堆栈信息

1.3.2 查找高CPU占有率线程堆栈信息

2 常用监控工具

2.1 top命令

2.2 jstack命令

2.3 jmap命令

2.3.1 java内存模型

2.3.2 示例

2.4 jstat

3 参考文章

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命令

查看线程堆栈信息

命令格式如:

[code]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子选项,则只计算活动的对象。

[code][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 : 垃圾回收统计

[code][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总耗时

3 参考文章

Java性能调优工具——Jstat

记一次线上Java程序导致服务器CPU占用率过高的问题排除过程

线上应用故障排查系列

JVM 性能调优监控工具

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: