JVM调优维护之常用命令
熟练使用Linux/Unix操作系统,对命令都不陌生。对JVM命令类似掌握常用命令熟练使用可以参考操作系统内存管理相关命令——因为JVM的重中之重就是内存的结构及管理(在Linux/Unix操作系统上可以用man查阅其使用说明,在usr/bin下j*开头的基本就是)。
具体命令可以参考官网https://docs.oracle.com/en/java/javase/17/docs/specs/man/index.html。以下介绍常用命令:
1、jps(https://docs.oracle.com/en/java/javase/17/docs/specs/man/jps.html)
看到ps就联想到了ps命令,而jps(java process Status Tool)也就 是,Java版的ps命令,查看java进程及其相关的信息,如果你想找到一个java进程的pid,那可以用jps命令替代linux中的ps命令了。
命令格式:jps [options] [hostid]
options参数解释:
-l : 显示进程id,显示主类全名或jar路径
-q : 显示进程id
-m : 显示进程id同时显示JVM启动时传递给main()的参数
-v : 显示进程id同时显示JVM启动时显示指定的JVM参数
hostid : 主机或其他服务器ip
最常用示例:
jps -l 输出jar包路径,类全名
jps -m 输出main参数
jps -v 输出JVM参数
通过jps跟踪到了main方法所在类。
注:Linux上除了安装java-17-openjdk.x86_64,还得安装java-17-openjdk-devel 。否则使用jps,提示无此命令。
2、jinfo(https://docs.oracle.com/en/java/javase/17/docs/specs/man/jinfo.html)
jinfo是用来查看JVM参数和动态修改部分JVM参数的命令,类似env命令查看操作系统环境变量。
可以通过该命令查看到虚拟机选项还有虚拟机参数等信息。
3、jstat(https://docs.oracle.com/en/java/javase/17/docs/specs/man/jstat.html)
jstat命令是使用频率比较高的命令,主要用来查看JVM运行时的状态信息,包括内存状态、垃圾回收等。类似操作系统中的free和top中关于内存信息相关内容,类似pidstat命令的使用。
从上图可以看到运行时内存的状态(jstat -gcutil)从而为维护调优分析提供信息。
4、jstack(https://docs.oracle.com/en/java/javase/17/docs/specs/man/jstack.html)
jstack是用来查看JVM线程快照的命令,线程快照是当前JVM线程正在执行的方法堆栈集合。使用jstack命令可以定位线程出现长时间卡顿的原因,例如死锁,死循环等。jstack还可以查看程序崩溃时生成的core文件中的stack信息。
命令格式:jstack [options] <pid>
option参数解释:
-e 除了输出扩展信息外,还显示关于线程的额外信息。
-l 除了输出栈信息外,还显示关于锁的附加信息
具体快照信息包含内容如下:
jstack一个很大的功能在于定位定位线程出现长时间卡顿的原因,例如死锁,死循环等。下面示例演示定位(win10,非CentOS,命令一样):
此处通过jps获得java进程号,再通过jstack定位。在实际生产中,不可能直接就知道是这个进程号对应的代码段有问题,对于cpu占用过高问题通过jstack与其他工具综合使用可以定位到问题代码,具体如下:
1)使用Process Explorer工具找到cpu占用率较高的线程
2)在thread卡中找到cpu占用高的线程id
3)线程id转换成16进制
4)使用jstack -l 查看进程的线程快照
5)线程快照中找到指定线程,并分析代码
5、jmap(https://docs.oracle.com/en/java/javase/17/docs/specs/man/jmap.html)
jmap可以生成 java 程序的 dump 文件(进行的内存镜像文件), 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及finalizer 队列。类似操作系统中提供pmap命令。