JVM 性能调优命令(jps,jinfo,jstat,jstack,jmap)

常用命令:jps、jinfo、jstat、jstack、jmap

jps

jps查看java进程及相关信息

bash 复制代码
jps -l 输出jar包路径,类全名
jps -m 输出main参数
jps -v 输出JVM参数

jps命令示例

显示本机的Java虚拟机进程:

bash 复制代码
# jps
15729 jar
92153 Jps
90267 Jstat

显示主类的完整包名或JAR文件名:

bash 复制代码
# jps -l
15729 one-more-1.0.0.RELEASE.jar
112054 sun.tools.jps.Jps
90267 sun.tools.jstat.Jstat

显示主类的完整包名或JAR文件名,并且显示JVM参数:

bash 复制代码
# jps -lv
15729 one-more-1.0.0.RELEASE.jar -Xmx1g -Xms1g -Xmn512m -XX:SurvivorRatio=4 -XX:MetaspaceSize=256m -XX:+UseG1GC
9043 sun.tools.jps.Jps -Denv.class.path=.:/usr/local/java/jdk1.8.0_251/lib:/usr/local/java/jdk1.8.0_251/jre/lib -Dapplication.home=/usr/local/java/jdk1.8.0_251 -Xms8m
90267 sun.tools.jstat.Jstat -Denv.class.path=.:/usr/local/java/jdk1.8.0_251/lib:/usr/local/java/jdk1.8.0_251/jre/lib -Dapplication.home=/usr/local/java/jdk1.8.0_251 -Xms8m

显示主类的完整包名或JAR文件名,并且显示传递给main()方法的参数:

bash 复制代码
# jps -lm
15729 one-more-1.0.0.RELEASE.jar
59014 sun.tools.jps.Jps -lm
90267 sun.tools.jstat.Jstat -gc 15729 1000

jinfo

jinfo查看JVM参数

jinfo -flags pid : 打印当前指定java进程中已经设定的所有JVM参数信息

bash 复制代码
jinfo -flags 7663

输入结果

bash 复制代码
Attaching to process ID 7663, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.121-b13
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line:  -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=49834:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8

jinfo -flag pid : 打印指定名称的参数

其中, 不包含上图的前缀 -XX: 等,不是 jinfo -flag -XX:NewSize 7663,而是 jinfo -flag NewSize 7663,不包含 -XX:

bash 复制代码
jinfo -flag NewSize 7663

输出结果:

bash 复制代码
-XX:NewSize=89128960

jinfo -flag [+|-] pid : 打开或关闭参数

bash 复制代码
jinfo -flag +PrintGC 7663

执行上面命令后,执行如下命令查看结果:

bash 复制代码
jinfo -flags 7663

jstat

jstat查看JVM运行时的状态信息,包括内存状态、垃圾回收

jstat -gc pid 5000 20 : 垃圾回收堆行为统计

5秒钟打印一次,一共打印20次。

bash 复制代码
jstat -gc pid 5000 20

输出结果:

bash 复制代码
root@yzh-zabbix-server:bin #jstat -gc 3111 5000 20
 S0C    S1C      S0U    S1U      EC       EU        OC         OU       MC     MU      CCSC   CCSU     YGC     YGCT  FGC    FGCT     GCT   
14336.0 24576.0  0.0    0.0   50688.0  50687.9   330752.0   330634.8  55296.0 53462.8 6400.0 5925.3    178    2.226  2483   438.892  441.117
14336.0 24576.0  0.0    0.0   50688.0  50688.0   330752.0   330607.2  55296.0 53467.9 6400.0 5925.3    178    2.226  2511   443.944  446.169
14336.0 24576.0  0.0    0.0   50688.0  50686.3   330752.0   330591.4  55296.0 53467.9 6400.0 5925.3    178    2.226  2541   449.050  451.275
14336.0 24576.0  0.0    0.0   50688.0  50687.9   330752.0   330603.5  55296.0 53467.9 6400.0 5925.3    178    2.226  2569   454.029  456.255
14336.0 24576.0  0.0    0.0   50688.0  50688.0   330752.0   330607.6  55296.0 53467.9 6400.0 5925.3    178    2.226  2598   458.971  461.197

jstack

jstack主要用来查看某个Java进程内的线程堆栈信息。主要用于,分析死锁,分析CPU 过高

语法格式如下。

bash 复制代码
jstack  pid

jstack排查Java死锁步骤

  1. 在终端中输入jsp查看当前运行的java程序
  2. 使用 jstack -l pid 查看线程堆栈信息
  3. 分析堆栈信息

在终端中输入jps查看当前运行的java程序

使用 jstack -l pid 查看线程堆栈信息

jstack 分析CPU过高问题

  1. top
  2. top -Hp pid
  3. jstack pid
  4. jstack -l [PID] >/tmp/log.txt
  5. 分析堆栈信息

在服务器上,我们可以通过top命令查看各个进程的cpu使用情况,它默认是按cpu使用率由高到低排序的

由上图中,我们可以找出pid为21340的java进程,它占用了最高的cpu资源,凶手就是它,哈哈!

top -Hp pid

通过top -Hp 21340可以查看该进程下,各个线程的cpu使用情况,如下

可以发现pid为21350的线程,CPU资源占用最高,嘻嘻,小本本把它记下来,接下来拿jstack给它拍片子~

jstack pid

通过top命令定位到cpu占用率较高的线程之后,接着使用jstack pid命令来查看当前java进程的堆栈状态,jstack 21350后,内容如下:

jstack -l [PID] >/tmp/log.txt

其实,前3个步骤,堆栈信息已经出来啦。但是一般在生成环境,我们可以把这些堆栈信息打到一个文件里,再回头仔细分析哦~

分析堆栈信息

我们把占用cpu资源较高的线程pid(本例子是21350),将该pid转成16进制的值

相关推荐
阿龟在奔跑8 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
王佑辉9 小时前
【jvm】方法区常用参数有哪些
jvm
王佑辉9 小时前
【jvm】HotSpot中方法区的演进
jvm
Domain-zhuo9 小时前
什么是JavaScript原型链?
开发语言·前端·javascript·jvm·ecmascript·原型模式
Theodore_10221 天前
7 设计模式原则之合成复用原则
java·开发语言·jvm·设计模式·java-ee·合成复用原则
我是苏苏1 天前
Web开发:ORM框架之使用Freesql的DbFrist封装常见功能
java·前端·jvm
天草二十六_简村人2 天前
Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化
java·jvm·数据库·mongodb·阿里云·微服务·云计算
老码沉思录2 天前
Android开发实战班 - 数据持久化 - Room 数据库应用
android·jvm·数据库
起名字真南2 天前
【C++】深入理解 C++ 中的继承进阶:多继承、菱形继承及其解决方案
java·jvm·c++·chatgpt·aigc
偶尔。5352 天前
JVM垃圾回收算法详解
jvm