虚拟机性能监控与故障处理工具

本文介绍了一系列用于Java虚拟机(JVM)性能监控与故障排查的工具,如jps、jstack、jmap、jstat等,以及如何使用它们来解决虚拟机中的常见问题,如性能瓶颈、死锁、内存泄漏等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虚拟机性能监控与故障处理工具

jps

jps是jdk提供的一个查看当前java进程的小工具。
常用命令:
jps –l:输出主类或者jar的完全路径名

jstack

  • 找出最耗时的java线程,据此分析代码
    步骤

1.ps -ef | grep java(或者输入服务的名称)
2.top -Hp pid1(pid1为需要分析的进程)
3.找到pid1中最耗时的线程ID pid2;将pid2输出16进制,因为jstack获取进程是将java线程Id用16进制输出ID。printf “%x\n” pid2
4.jstack pid1 | grep -A 10 pid2。 -A 10表示查找到所在行的后10行
参考:https://blog.youkuaiyun.com/sxhong/article/details/78603633

  • 找出死锁问题

使用jps查看线程ID
使用jstack ID:查看线程情况

jmap

jmap -heap pid 展示pid的整体堆信息

在用cms gc的情况下,执行jmap -heap有些时候会导致进程变T,因此强烈建议别执行这个命令,如果想获取内存目前每个区域的使用状况,可通过jstat -gc或jstat -gccapacity来拿到。

jmap -histo pid 展示class的内存情况

说明:instances(实例数)、bytes(大小)、classs name(类名)。它基本是按照使用使用大小逆序排列的。

jmap -histo:live pid>a.log

可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -histo:live这个命令执行,JVM会先触发gc,然后再统计信息。

dump 将内存使用的详细情况输出到文件

jmap -dump:live,format=b,file=a.log pid
将内存信息dump到a.log文件中。这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。

jhat

1.导出堆
jmap -dump:live,file=a.log pid
2.分析堆文件
jhat -J-Xmx512M a1.log
说明:有时dump出来的堆很大,在启动时会报堆空间不足的错误,可加参数:jhat -J-Xmx512m 。这个内存大小可根据自己电脑进行设置。
3.查看html http://ip:7000/

jstat

jstat -class pid(监视类装载、卸载数量、总空间以及耗费的时间)

Loaded : 加载class的数量
Bytes : class字节大小
Unloaded : 未加载class的数量
Bytes :未加载class的字节大小
Time : 加载时间

jstat -gc pid(垃圾回收堆的行为统计,常用命令)

C即Capacity 总容量
U即Used 已使用的容量
S0C : survivor0区的总容量
S1C : survivor1区的总容量
S0U : survivor0区已使用的容量
S1C : survivor1区已使用的容量
EC : Eden区的总容量
EU :Eden区已使用的容量
OC : Old区的总容量 OU :
Old区已使用的容量 PC : 当前perm的容量 (KB)
PU :perm的使用 (KB)
YGC : 新生代垃圾回收次数
YGCT : 新生代垃圾回收时间
FGC : 老年代垃圾回收次数
FGCT :老年代垃圾回收时间
GCT : 垃圾回收总消耗时间

-gcutil(同-gc,输出的是已使用空间占总空间的百分比)
-gccause(垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因)

jconsole

jconsole.exe ip:port
Java件事与管理控制台

javap

javap -c xxx.class
输出的内容就是字节码。
https://www.cnblogs.com/kongzhongqijing/tag/jvm/

综合应用场景

OOM解决方案:

1.首先配置JVM启动参数,让JVM在遇到OutOfMemoryError时自动生成Dump文件。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path
2.jmap -dump:format=b,file=/path/heap.bin 进程ID 如果只dump heap中的存活对象,则加上选项-live。
3.后使用eclipse的mat插件或jhat命令。 用MAT打开这个文件heap.bin,利用现成的OOM工具进行分析。 用jhat命令可以参看 jhat -port 5000 heapDump 在浏览器中访问:http://localhost:5000/
查看详细信息

性能问题查找解决方案

1.发现问题:
1.1使用uptime命令查看CPU的Load情况,Load越高说明问题越严重;
1.2 使用jstat查看FGC发生的频率及FGC所花费的时间,FGC发生的频率越快、花费的时间越高,问题越严重;
2.在应用快要发生FGC的时候把堆导出来:
2.1 执行jstat -gc,将输出包括了新生代、老年代及持久代的当前使用情况,如果不停的重复上面的命令,会看到这些数字的变化,变化越大说明系统存在问题的可能性越大。当看到使用率为99%(具体数值可以设置)或快接近的时候,就立即可以执行导出堆栈的操作了。
2.2 将数据导出: jmap -dump:format=b,file=heap.bin pid 。这个时候会在当前目录以生成一个heap.bin这个二进制文件。
3.通过命令查看大对象
查看对象数最多的对象,并按降序排序输出:
执行:jmap -histo |grep alibaba|sort -k 2 -g -r|less
查看占用内存最多的最象,并按降序排序输出:
执行:jmap -histo |grep alibaba|sort -k 3 -g -r|less
4.数据分析
这个时候将dump出的文件在ECLIPSE中打开,使用MAT进行分析(ECLIPSE需要先安装MAT插件)
5.优化
优化的思路就是上面所列出来的问题,查看实现代码中所存在问题,具体问题具体分析。

频繁GC问题或内存溢出问题

1.使用jps查看线程ID
2.使用jstat -gc pid 250 20 查看GC的增长情况
3.使用jstat -gccause:额外输出上次GC原因
4.使用jmap -dump:format=b,file=heapDump 3331生成堆转储文件
5.使用jhat或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情况。
6.结合代码解决内存溢出或泄露问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值