java诊断与调优常用命令jps、jmap、jstack、jstat使用实战

背景

在Java应用的生产环境中,不可避免地会遇到异常甚至宕机等问题。为了诊断、分析和优化这些问题,我们必须深入了解其原因,以避免再次出现。尽管现代的可视化工具提供了更为便捷的界面和操作体验,但了解基本的命令行工具仍然至关重要。这些可视化工具背后,往往依赖于这些基本命令来收集数据,并进行综合处理以展示最终结果。
今天,我们将从实战的角度出发,深入探讨jps、jmap、jstack和jstat这四个Java命令行的常用方法。通过掌握这些工具,将能够更有效地监控、分析和调优Java应用程序,从而提高其稳定性和性能。

jps

说明

该命令的作用获取java进程号。
其他几个命令jmap、jstack、jstat,需要进程号作为输入,因此我们放在首位来介绍。

当一台服务器运行多个java进程时,该命令默认只输出进程号和应用名,可能无法区分哪个是自己需要分析的对象,这时候可以附加参数 -l(小写字母L),显示主类的完整包路径。
此外,附加参数-v,可显示jvm参数。
image.png

常见问题

问题1:无效命令
原因:没有配置环境变量
解决:配置环境变量,或者到jdk对应目录bin下打开cmd窗口

问题2:windows环境下java进程存在,但执行jps无结果
原因:windows权限问题,在 Windows系统中,每个 java 进程启动之后都在 %TMP%/hsperfdata_${user} (${user}为当前登录用户名) 目录下建立一个以该 java 进程 pid 为文件名的文件,用以记录该 java 进程的一些信息。 通常是因为没有对这个文件的读写权限而导致jps命令查看不到进程。
解决:给当前操作系统用户,设置足够权限。
步骤:
windows徽标键+R,打开运行窗口
image.png
输入%TMP%,回车打开临时文件夹所在的目录,然后找hsperfdata_开头的文件夹,结尾是操作系统当前登录的用户名。
image.png
在该文件夹上右键菜单,选择属性,切换到安全标签,给本地管理员组或你需要授权的用户,设置完整权限。
image.png
注意,有时候需要重启操作系统才会令权限生效。

jmap

说明

该命令的作用是获取java进程内存情况。

常用命令

显示内存使用情况

jmap -heap [进程ID]
下图是执行该命令,抓取的进程号为4536的java应用进程当前堆的信息。
image.png

统计内存中各类型对象的数量

jmap -histo [进程ID]
按类型显示实例个数及占用空间,可用于排查异常情况,如内存泄露引发的大量对象占用内存不释放。
image.png
四列含义依次是序号、实例数量、占用空间、对应类名,注意如下特殊标记代表含义:
[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][]

导出堆文件

jmap -dump:format=b,file=20240426.dump [进程ID]
生成堆的dump文件,用于内存使用情况进一步分析,通常会辅助以dump文件分析工具。

jstack

说明

主要用于查看Java进程中线程的状态信息、堆栈信息、锁信息等,它可以在Java应用程序运行时对线程状态进行快照,输出每个线程正在调用的方法列表、状态信息以及线程间的同步等待情况。通过jstack可以帮助开发人员定位线程死锁、死循环、内存泄漏等问题。
具体功能包括:

  • 显示Java虚拟机内所有线程的快照信息
  • 显示某个线程的堆栈信息
  • 显示某个线程或整个Java进程内锁的持有情况
  • 检查某个Java进程内的堆信息
  • 显示某个Java进程内的JNI信息

常用命令

查看堆栈信息

jstack [进程ID]
显示堆栈信息,通常用于查看是否存在死锁。
image.png

jstat

说明

查看堆内存各部分的使用量以及加载类的数量。

常用命令

垃圾回收统计

jstat -gc pid [interval] [count]
jstat [-命令选项] [进程ID] [间隔时间(毫秒)] [查询次数]

该命令是按容量显示,切换成百分比则更直观
命令如下:jstat -gcuitl pid [interval] [count]
image.png
使用该命令,可查看新生代(伊甸园、两个幸存区)、老年代的内存使用情况,垃圾回收频率。

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学海无涯,行者无疆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值