欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JVM性能调优监测工具

程序员文章站 2022-05-06 14:09:42
...

查看正在运行的程序

jps主要用来输出JVM中运行的进程状态信息。语法格式如下:

 
jps [options] [hostid]

options:
-q 不输出类名、Jar名和传入main方法的参数
-m 输出传入main方法的参数
-l 输出main类或Jar的全限名
-v 输出传入JVM的参数

hostid:不填,默认为本机

CPU飙升排查

jstack主要用来查看某个Java进程内的线程堆栈信息。

  1. 通过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID。
  2. 再次通过 top -Hp [进程 ID] 找到 CPU 消耗最高的线程 ID,并记住线程 ID.
  3. 通过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中。具体命令:jstack -l [进程 ID] >jstack.log。
  4. 由于刚刚的线程 ID 是十进制的,而堆栈信息中的线程 ID 是16进制的,因此我们需要将10进制的转换成16进制的,并用这个线程 ID 在堆栈中查找。使用 printf “%x\n” [十进制数字] ,可以将10进制转换成16进制。
  5. 通过刚刚转换的16进制数字从堆栈信息里找到对应的线程堆栈。就可以从该堆栈中看出端倪。

C2 编译器执行编译时也会抢占 CPU,什么是 C2编译器呢?当 Java 某一段代码执行次数超过10000次(默认)后,就会将该段代码从解释执行改为编译执行,也就是编译成机器码以提高速度。而这个 C2编译器就是做这个的。如何解决呢?项目上线后,可以先通过压测工具进行预热,这样,等用户真正访问的时候,C2编译器就不会干扰应用程序了。如果是 GC 线程导致的,那么极有可能是 Full GC ,那么就要进行 GC 的优化。

内存使用情况监测

jmap用来查看堆内存使用状况。

  • 使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。
  • 使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象。
  • 使用jmap -permstat pid 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来。

JVM统计监测

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量

 
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]

 

比如下面输出的是GC信息,采样时间间隔为250ms,采样数为4:

 
   jstat -gc 14157 250 4
S0C     S1C     S0U     S1U       EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   
192.0  192.0   64.0   0.0    6144.0   1854.9   32000.0     4111.6   55296.0 25472.7    702    0.431   3      0.218    0.649
192.0  192.0   64.0   0.0    6144.0   1972.2   32000.0     4111.6   55296.0 25472.7    702    0.431   3      0.218    0.649
192.0  192.0   64.0   0.0    6144.0   1972.2   32000.0     4111.6   55296.0 25472.7    702    0.431   3      0.218    0.649
192.0  192.0   64.0   0.0    6144.0   2109.7   32000.0     4111.6   55296.0 25472.7    702    0.431   3      0.218    0.649

 

我们知道
堆内存 = 年轻代 + 年老代 + 永久代
年轻代 = Eden区 + 两个Survivor区(From和To)

 
S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used)
EC、EU:Eden区容量和使用量
OC、OU:年老代容量和使用量
PC、PU:永久代容量和使用量
YGC、YGT:年轻代GC次数和GC耗时
FGC、FGCT:Full GC次数和Full GC耗时
GCT:GC总耗时

查看文件字节码

这里扩展一下如何查看文件字节码

 
Javac Foo.java 将文件解析成class字节码文件
Javap Foo.class 打印所有非私有的字段和方法
Javap -p Foo.class 还将打印私有的字段和方法
Javap -v Foo.class 尽可能打印所有信息
Javap -c Foo.class 打印方法对应的字节码

参考链接:
https://mp.weixin.qq.com/s/-5vdgexMyoiMRVPlOO88Sw
https://mp.weixin.qq.com/s/LJGWPRBc_BJLTfopi7Lttg