当前位置: 代码迷 >> 综合 >> JVM实战-常用工具
  详细解决方案

JVM实战-常用工具

热度:22   发布时间:2024-02-09 03:59:42.0

**工欲善其事必先利其器!!!**

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.accessjmxremote.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

在这里插入图片描述