目录
- 概述
- GCEasy
- 官网
- jvm内存占用情况
- 关键性能指标
- 堆内存与元空间优化
- MAT
- 安装
- MAT相关概念说明
- 内存泄漏与内存溢出
- shallow heap及retained heap
- outgoing references与incoming references
- Dominator Tree
- GCViewer
- Arthas
- 下载安装与启动
- jdk8
- jdk 11
- jdk11自定义boot jar
- jdk17
- 常用命令
- dashboard
- 查看线程 thread
- 反编译已加载类源码
- 结束
概述
工具 | 详解 |
---|---|
GCEasy | 免费GC日志可视化分析Web工具 |
MAT:Memory Analyzer Tool | 可视化内存分析工具 |
GCViewer | 开源的GC日志分析工具 |
Arthas | 线上java程序诊断工具,功能非常强大 |
GCEasy
业界首先采用机器学习算法解决GC日志分析问题,GCeasy内置机器智能可以自动检测jvm和android GC日志中的问题,并推荐解决方案。
官网
地址
GC日志分析是免费的,Machine Learning 收费
- 几秒内解决GC和内存问题
- jvm堆优化建议
- 机器学习
默认英文,切换语言成中文,上传日志文件,即可分析
jvm内存占用情况
关键性能指标
堆内存与元空间优化
MAT
MAT是一个强大的可视化内存分析工具,可以快捷、有效的帮助找到内存泄露、减少内存消耗的分析工具。MAT是(Memory Analyzer Tool) 的缩写,是一种快速,功能丰富的java堆分析工具。
功能:
- 找到最大的对象,因为MAT提供显示合理的累积大小(retained size)
- 探索对象图,包括inbound和outbound引用,即引用此对象的和此对象引出的
- 查找无法回收的对象,可以计算从垃圾收集器根到相关对象的路径
- 找到内存浪费,比如冗余的String对象、空集合对象
安装
MAT安装有两种方式,一种是以eclipse插件方式安装,一种是独立安装。
注意: 可能有bug,更新版本即可。
MAT download
MAT相关概念说明
内存泄漏与内存溢出
找到 jvm
中最大的对象,是解决内存泄漏与内存溢出关键点。
- 内存泄露:对象是垃圾了,还存在被GCRoots引用的情况,无法被垃圾收集器回收
- 解决方案:找出泄漏的代码位置和原因,具体问题具体解决
- 内存溢出:内存中的对象非常多,堆空间 不足,就会出现。
- 解决方案:检查堆大小设置是否合理,检查是否存在对象生命周期太长、持有状态时间太长的情况。
shallow heap及retained heap
- shallow heap:对象本身占用内存的大小,也就是对象内存区域的总和。
- retained heap:对象及对象引用链中所有对象的大小总和,如果一个对象被释放掉,因为该对象的释放而被释放的所有对象的大小。相对于shallow head,Retained heap可以更精确的反映一个对象实际占用的大小。
outgoing references与incoming references
- outgoing references:表示该对象的出节点(被该对象引用的对象)。
- incoming references:表示该对象的入节点(引用到该对象的对象)。
Dominator Tree
Dominator Tree 对象的支配树;帮助快速的发现占用内存最大的块,也能帮助分析对象的依赖关系。
GCViewer
GCViewer是一款开源的GC日志分析工具。项目的GitHub主页对各个指标提供了完整的描述信息,需要安装jdk才能使用。借助GCViewer日志分析工具,可以非常直观的分析出待调优点。
可从以下几方面来分析:
- Memory:分析totalheap、Tenuredheap、Youngheap内存占用率及其它指标,理论上内存占用率越小越好
- Pause:分析GC pause、FullGC pause、Total pause 三个大项中各指标,理论上GC次数越少越好,GC时长越小越好。
Arthas
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常、监测方法执行耗时,类加载信息等,大大提升线上问题的排查效率。
Arthas支持jdk1.6+,支持Linux、Mac、Windows,采用命令行交互模式,则是提供丰富的Tab自动补全功能,进一步方便进行问题的定位和诊断。
下载安装与启动
download
# 不行
/data/soft/jdk-17.0.9/bin/java -jar arthas-boot.jar
#
/data/soft/jdk-11.0.20/bin/java -jar math-game.jar
/data/soft/jdk-11.0.20/bin/java -jar arthas-boot.jar
jdk8
没有问题
jdk 11
/data/soft/jdk-11.0.20/bin/java -jar math-game.jar
/data/soft/jdk-11.0.20/bin/java -jar arthas-boot.jar
jdk11自定义boot jar
jdk17
/data/soft/jdk-17.0.9/bin/java -jar math-game.jar
/data/soft/jdk-17.0.9/bin/java -jar arthas-boot.jar
自己写的jdk17的spring boot 不行。
常用命令
dashboard
展示当前进程的信息,按 ctrl+c
可以中断执行
dashboard
查看线程 thread
通过 thread
命令来获取到应用进程的线程信息。thread -1
会打印线程统计信息。
TIMED_WAITING(超时等待) 状态相当于在等待状态的基础上增加了超时限制。
thread -1
反编译已加载类源码
运行期通过jad来反编译项目代码。
jad com.fun.demo.controller.JMeterController
结束
jvm第三方工具使用实践
至此就结束了,如有疑问,欢迎评论区留言。