JVM性能调优监测工具

查看正在运行的程序

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章