**工欲善其事必先利其器!!!**
1)jconsole
jconsole工具是JDK自带的可视化监控工具。
查看java应用程序的运行概况、监控堆信息、永久区使用情况、类加载情况等。
# 启用jconsole,在命令行中输入
jconsole
2)jvisualvm
可以在[工具 - 插件 - 可用插件]中选择Visual GC
插件来查看堆内存的运行情况。
监控本地JVM进程
监控远程JVM进程
可添加JMX连接,不过需要远程应用开启JMX功能。
- 添加JMX启动参数
-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=8998 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.access.file=/usr/local/jdk/conf/jmxremote.access -Dcom.sun.management.jmxremote.password.file=/usr/local/jdk/conf/jmxremote.password
- 在 /usr/local/jdk/conf 中添加两个文件
jmxremote.access
和jmxremote.password
可指定绝对路径,也可指定相对路径。
1)jmxremote.access 访问权限文件
guest readonly
manager readwrite
2)jmxremote.password 账号文件
guest guest
manager manager
3)文件授权
# 文件授权
chmod 600 *jmxremote*
4)监听端口
# 得到PID
lsof -i:8998
# 查看8998监听情况
netstat -antup | grep PID
3)Arthas
Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,是排查jvm相关问题的利器。
官网:https://github.com/alibaba/arthas
4)MAT
下载地址 https://www.eclipse.org/mat/downloads.php
Histogram
列出内存中的对象,对象的个数及其大小。
Class Name:类名称,java类名
Objects:类的对象的数量,这个对象被创建了多少个
Shallow Heap:一个对象内存的消耗大小,不包含对其他对象的引用
Retained Heap:是shallow Heap的总和,即该对象被GC之后所能回收到内存的总和
Leak Suspects
查找并分析内存泄漏的可能原因。
Reports—>Leak Suspects—>Details
Top Consumers
列出大对象。
Leak Identification -->Top Consumers
MAT启用异常处理
---------------------------
MemoryAnalyzer
---------------------------
Java was started but returned exit code=13
... ...
**方案:**修改 MemoryAnalyzer.ini 文件
1、配置javaw.exe路径
-vm /usr/local/jdk/bin/javaw.exe
2、配置日志路径
-data /logs/mat
-vm
D:\software\java\jdk1.8.0_172\bin\javaw.exe
-startup
plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar
-data
E:\temp\logs\mat
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.700.v20180518-1200
-vmargs
-Xmx1024m
【重点】MAT具体分析步骤
1、打开Histogram窗口
2、根据列Retained Heap降序排序,找到占用Heap最大的几个类记录
3、右击类名-->List Objects-->with incoming references-->列出该类的实例
比如模拟数组内存溢出,可找到数组元素为ArrayList,也可找到ArrayList在具体类中的变量名称,这样定位到代码。
4、选中占用空间最大的对象,如果是数组,可从左侧Attributes面板中可看到元素列表,特别关注元素是否是业务类。
5、展开占用空间最大的对象,可看到该对象(或其下的元素)所属Class,特别关注所属Class是否是业务类。
6、右击对象-->Merge Shortest Paths to GC Roots-->exclude all phantom/weak/soft etc.refrences
7、找到GCRoot以及原因
比如模拟数组内存溢出,可找到数据里面的元素对象,然后可定位到具体的类,在结合代码来分析具体是哪个点导致了OOM。
5)GC 日志分析工具
可通过工具来分析GC日志,包含指标:吞吐量及GC暂停平均时间、最大时间、各个时间段的比例、GC发生的原因、次数、时间等。
主要关注吞吐量和停顿时间。
1、在线工具
官网: http://gceasy.io
关键指标
GC收集统计
GC原因
2、GCViewer
官方地址:包含各项指标的解释
https://github.com/chewiebug/GCViewer
# 通过工具来分析GC日志
java -jar gcviewer-1.36-SNAPSHOT.jar