Arthas JVM 调优工具 与 MemoryAnalyzer 分析 hprof 文件工具
阿里巴巴开源的一个 JVM 调优工具 —— arthas(阿尔萨斯)。
一、Arthas
1.1 安装
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
如果下载速度太慢,可以用gitee上的源
curl -O https://arthas.gitee.io/arthas-boot.jar
1.2 启动
java -jar arthas-boot.jar
arthas 在启动时会检测本机运行的 jvm 进程,然后让用户选择需要绑定的进程,后面的操作都是针对选定的进程的。
[INFO] Download arthas success.
[INFO] arthas home: C:\Users\MH\.arthas\lib\3.6.8\arthas
[INFO] Try to attach process 21752
[INFO] Found java home from System Env JAVA_HOME: D:\Java\JDK1.8_64
[INFO] Attach process 21752 success.
[INFO] arthas-client connect 127.0.0.1 3658
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version 3.6.8
main_class
pid 21752
time 2023-05-04 15:33:32
出现此页面 arthas 启动成功。
1.3 使用 Arthas 解决问题
1 CPU占用过高
## 列出线程详细信息
[arthas@21752]$ thread
Threads Total: 156, NEW: 0, RUNNABLE: 12, BLOCKED: 0, WAITING: 108, TIMED_WAITING: 21, TERMINATED: 0, Internal threads:
15
ID NAME GROUP PRIORITY STATE %CPU TIME INTERRUPTE DAEMON
16 http-nio-8080-exec-2 main 5 RUNNABLE 99 0:25 false true
29 Attach Listener system 9 RUNNABLE 0 0:0 false true
## 通过 thread + ID 输出该线程的栈信息定位问题
[arthas@2467]$ thread 16
"http-nio-8080-exec-2" Id=16 RUNNABLE
at com.spareyaya.jvm.service.EndlessLoopService.service(EndlessLoopService.java:19)
at com.spareyaya.jvm.controller.JVMController.endlessLoop(JVMController.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
2 死锁
## thread -b 检查死锁
[arthas@2997]$ thread -b
"Thread-3" Id=29 BLOCKED on java.lang.Object@3f20bf9 owned by "Thread-4" Id=30
at com.spareyaya.jvm.service.DeadLockService.service1(DeadLockService.java:27)
- blocked on java.lang.Object@3f20bf9
- locked java.lang.Object@2fea801a <---- but blocks 1 other threads!
at com.spareyaya.jvm.controller.JVMController.lambda$deadLock$0(JVMController.java:37)
at com.spareyaya.jvm.controller.JVMController$$Lambda$456/748979989.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
3 内存泄漏
用 dashboard 命令来动态查看内存情况,如果内存使用率在不断上升,而且 gc 后也不下降,后面还发现 gc 越来越频繁,很可能就是内存泄漏了。
这个时候我们可以直接用 heapdump 命令把内存快照 dump 出来,作用和 jmap 工具一样,然后把得到的 dump 文件使用 MAT 堆内存分析工具 MemoryAnalyzer.exe 分析
[arthas@23581]$ heapdump --live /root/jvm.hprof
Dumping heap to /root/jvm.hprof...
Heap dump file created
二、MAT(MemoryAnalyzer)工具使用
启动后可以通过顶部菜单的 File->Open Heap Dump...
来打开一个快照文件,也可以在welcome 界面中点击 Open a Heap Dump
。如果你的快照文件特别大,需要调整jvm参数,在 windows 下修改 MemoryAnalyzer.ini 文件,把 -Xmx
参数的值设置成适合的值(默认是1024M)。
上图最中央的那个饼状图展示了最大的几个对象所占内存的比例
底部有几个核心的菜单按钮
Histogram:可以列出内存中每个对象的名字、数量以及大小。
Dominator Tree:会将所有内存中的对象按大小进行排序,并且可以分析对象之间的引用结构
Top Consumers:通过图形列出最大的object以及包路径
Leak Suspects:分析内存泄漏的可能原因
Top Components: 列出大于总堆1%内存的对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!