JVM性能调优监测工具
程序员文章站
2022-05-06 14:09:42
...
查看正在运行的程序
jps主要用来输出JVM中运行的进程状态信息。语法格式如下:
|
CPU飙升排查
jstack主要用来查看某个Java进程内的线程堆栈信息。
- 通过 top 命令找到 CPU 消耗最高的进程,并记住进程 ID。
- 再次通过 top -Hp [进程 ID] 找到 CPU 消耗最高的线程 ID,并记住线程 ID.
- 通过 JDK 提供的 jstack 工具 dump 线程堆栈信息到指定文件中。具体命令:jstack -l [进程 ID] >jstack.log。
- 由于刚刚的线程 ID 是十进制的,而堆栈信息中的线程 ID 是16进制的,因此我们需要将10进制的转换成16进制的,并用这个线程 ID 在堆栈中查找。使用 printf “%x\n” [十进制数字] ,可以将10进制转换成16进制。
- 通过刚刚转换的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命令可以查看堆内存各部分的使用量,以及加载类的数量
|
比如下面输出的是GC信息,采样时间间隔为250ms,采样数为4:
|
我们知道
堆内存 = 年轻代 + 年老代 + 永久代
年轻代 = Eden区 + 两个Survivor区(From和To)
|
查看文件字节码
这里扩展一下如何查看文件字节码
|
参考链接:
https://mp.weixin.qq.com/s/-5vdgexMyoiMRVPlOO88Sw
https://mp.weixin.qq.com/s/LJGWPRBc_BJLTfopi7Lttg