me/JFR/1_查看JFR事件的工具JMC.md

30 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### Java Mission Control
- 官网下载地址https://adoptium.net/zh-CN/jmc/
- 大佬提供的下载地址https://zhxhash-blog.oss-cn-beijing.aliyuncs.com/resources/jmc.zip
解压后执行 jmc.exe 无法启动的话可能是没有配置JDK环境变量或JDK版本低于 JDK 11 导致的。可以配置JDK环境变量也可以在 jmc.exe 同级目录下创建一个 jre 目录将jdk的完整目录结构拷贝至该目录都可以正常打开 jmc.exe。
### 使用方式
先 dump 一份jfr记录文件<a href='./0_初识Java%20Flight%20Record.md' target='_blank'>上一篇文章</a>有介绍具体的操作方法,建议利用 begin 还有 end 参数截取你感兴趣的时间段控制一下jfr文件的大小。然后再回到jmc里通过【文件】/【打开文件】/【选择dump的jfr文件】打开。由于jfr文件里的数据要导入内存然后生成索引和报表实际内存占用大概是原始文件的4~6倍左右。如果你的系统内存不足JMC会提示你只截取一部分查看。
### JVM调优简单示例
线上某个实例dump出了 jfr 文件。下载到本地,按照持续时间倒序查看 GC Event
<img width='80%' src='https://picx.zhimg.com/v2-85908b178dbd3adc1a420ddc4f43683f_1440w.jpg'>
有一些耗时比较高的**GC 事件Old GC**原因是**G1 Humongous Allocation**。
在G1中**大于 region 50**的对象视为大对象,频繁分配大对象会导致性能问题。如果 region 里面包含大量的大型对象,则该 region 中**最后一个具有巨型对象的区域**与**区域末端之间的空间**将不会使用,导致堆内存空间碎片化。调整的方法一般是**修改 region 的大小 > 这类大对象的 2 倍以上**。那么这个大对象有多大呢?我们可以通过*Old Object Sample*来查看老对象采样,一般随着你的程序运行时间增长,这个采集会更加准确地命中到你最关注的对象。
<img width='80%' src='https://pica.zhimg.com/v2-19dc5e1d4e9fd1f249f736c7aed0e94a_r.jpg'>
注意 **heap used 是当前所有对象占用的内存大小**。这个对象大小,可以通过数组大小计算而出,这里最大就是 3.31 * 10^6 字节。我们再来看一下当前*G1HeapRegionSize*的配置,通过查看*Unsiged Long Flag Event*
<img width='80%' src='https://pic3.zhimg.com/v2-be449976acc125243d2b57f1946365cc_r.jpg'>
发现大小是4.19 * 10^6 字节,不足最大对象的两倍。所以我们需要将*G1HeapRegionSize*至少调整到 6.62 * 10^6 字节,调整之后,不再出现 G1 Old GC。
<a href='./0_初识Java%20Flight%20Record.md' target='_blank'>返回上一节</a> <a href='./2_Event结构及配置.md' target='_blank'>查看下一节</a>