转载:https://mp.weixin.qq.com/s/iVZT37cNRV0UQ1qNe-hWdw
JVM 日常调优步骤总结起来就是:
1、首先通过 jps 命令查看当前进程;
2、然后根据 pid 通过 jinfo 命令查看和修改 jvm 参数;
3、通过 jstat 命令查看 class 的加载信息以及 GC 信息;
4、通过 jstack 命令查看线程堆栈信息;
5、通过 jmap 命令查看堆内存信息。
jvm常用查询指令: https://blog.csdn.net/weixin_44284706/article/details/128878278
用以上的命令查看可以解决一些问题,但是对于 GC 日志以及 dump 文件不便于分析,因此下面介绍几个常用的图形化界面工具。
可以对本地进程或者远程进程,连接之后可以进行 JVM 信息查看:
-Dcom.sun.management.jmxremote.port=8989
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access
-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password
2、在 tomcat 目录 conf/ 文件中添加两个文件 jmxremote.access 和 jmxremote.password,
一个是账号的权限,一个是账号密码,并给这 2 个文件授予可读写权限:
chmod -R 600 jmxremote.access 、
chmod -R 600 jmxremote.password。
jvisualvm 连接远端 tomcat 进程:
1、在 jvisualvm 中选中“远程”,右键“添加”
2、主机名上写服务器的 ip 地址,比如 66.xxx.xxx.xxx,然后点击“确定”
3、右键该主机“66.xxx.xxx.xxx”,“添加 JMX 连接”,表示通过 JMX 技术连接远端服务器的 Java 进程
4、在“添加 JMX 连接”界面中“连接”里输入“66.xxx.xxx.xxx:8989”,勾选“使用安全凭证”,输入用户名和密码,点击确定进行远端连接。
1、下载arthas-boot.jar:
curl -O https://arthas.aliyun.com/arthas-boot.jar
2、用java -jar的方式启动
java -jar arthas-boot.jar
具体可参考:
https://github.com/alibaba/arthas
https://github.com/alibaba/arthas/blob/master/README_CN.md
Java堆分析器Memory Analyzer(MAT,Memory Analyzer Tool)是一种用于分析Java堆的强大工具。MAT是一个开源工具,可以与Eclipse集成使用,也可以作为独立的命令行工具使用。它由Java开发,可以在任何支持Java的平台上运行。
MAT的主要功能包括:
快速查找和比较不同heap dump文件。导出报告和分析结果,包括CSV、Excel、XML和HTML格式。
Eclipse 的 MAT 插件 MemoryAnalyzer 用于分析堆内存泄漏,
下载地址:https://www.eclipse.org/mat/downloads.php 。
下载以后解压,我们可以运行 mat 目录下的 MemoryAnalyzer.exe,用它打开 Heap Dump 文件,
以便于我们进行分析堆内存泄漏问题,如下:
Histogram:查看内存中的每个类的对象实例、对象的个数及其大小
Leak Suspects:查看内存泄漏的可能原因
Top Consumers:查看大对象
在类名上右键—>List Objects—>with incoming references 可以列出该类的实例,如下:
在类名上右键—>Merge Shortest Paths to GC Roots—>exclude all phantom/weak/soft etc.references 可以看到 GC Root 以及没有垃圾回收的原因,如下:
官方网址:https://perfma.com
Java 虚拟机参数分析:https://club.perfma.com/topic/product-opts
Java 线程 Dump 分析:https://club.perfma.com/topic/product-thread
Java 内存 Dump 分析:https://club.perfma.com/topic/product-memory
通过以下命令开启 GC 日志打印,拿到 GC 日志以后,就可以用工具进行进一步地分析了。
-XX:+PrintGCDetails:打印 GC 详细信息
-XX:+PrintGCDateStamps:在每个 GC上打印日期戳
-XX:+PrintGCTimeStamps:在每个 GC 上打印时间戳
-Xloggc:指定 GC log 的位置和日志文件名称
在运行程序时,为了快速发生内存溢出,设置内存为 10M
-Xms10M -Xmx10M
设置以下的参数,可以开启 GC 日志打印
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-Xloggc:d:/dump/gc.log