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进制的值

相关推荐
Joeysoda6 小时前
Java数据结构 时间复杂度和空间复杂度
java·开发语言·jvm·数据结构·学习·算法
18你磊哥6 小时前
java重点学习-JVM组成
java·开发语言·jvm
蜜桃小阿雯8 小时前
JAVA开源项目 校园美食分享平台 计算机毕业设计
java·jvm·spring boot·spring cloud·intellij-idea·美食
longlongqin9 小时前
JIT(即时编译)技术
jvm
ZachOn1y15 小时前
Java 入门指南:JVM(Java虚拟机)—— 双亲委派模型(Parent Delegation Model)
java·jvm·后端·java-ee·团队开发·个人开发
寻求出路的程序媛16 小时前
JVM —— 类加载器的分类,双亲委派机制
java·jvm·面试
深鱼~16 小时前
【JVM】垃圾回收机制|死亡对象的判断算法|垃圾回收算法
jvm
Lill_bin16 小时前
JVM内部结构解析
jvm·后端·spring cloud·微服务·云原生·ribbon
视觉小鸟17 小时前
【JVM安装MinIO】
前端·jvm·chrome
ZachOn1y18 小时前
Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器
java·开发语言·jvm·后端·java-ee·个人开发