【Java知识】java进阶-一个好用的java应用分析工具arthas
文章目录
- 概述
- 主要功能
- 使用方法
- 安装和启动 Arthas
- 使用 Arthas 命令
- 1. dashboard
- 2. thread
- 3. sc (Search Class)
- 4. jad (Java Assembly Disassemble)
- 5. monitor
- 6. watch
- 7. trace
- 8. 退出 Arthas
- 🔍 Arthas 如何帮助定位内存泄漏问题?
- 1. 监控整体内存状况
- 2. 生成堆转储文件
- 3. 分析堆转储文件
- 4. 使用 `--live` 标志精确定位
- 5. 监控 profiler 自身内存占用
- 📊 如何解读Arthas生成的内存使用报告?
- 1. 使用`memory`命令查看内存状态
- 2. 分析`heapdump`生成的堆转储文件
- 3. 使用MAT工具分析堆转储文件
- 4. 使用`dashboard`命令查看实时数据面板
- 5. 使用`histogram`命令查看对象分布
- 使用Arthas诊断并定位CPU异常占用问题
- 第一步:确保Arthas环境准备就绪
- 第二步:排除GC影响
- 第三步:定位高CPU消耗的线程
- 第四步:深入分析高CPU消耗线程
- 第五步:使用其他Arthas命令进一步诊断
概述
Arthas 是由阿里巴巴开源的一款功能强大的 Java 诊断工具,它可以帮助开发者在不修改代码、不重启应用程序的前提下,对线上问题进行快速诊断和定位。以下是 Arthas 的一些主要功能、使用方法以及对应的命令行详解:
主要功能
- Dashboard:实时查看 Java 服务的运行状况,包括线程、内存、GC 等信息。
- 查看入参/返回值/异常:实时查看方法调用的入参、返回值、异常。
- 在线热更新:通过
jad
、sc
、redefine
等命令实现代码热更新。 - 类冲突:秒解类冲突问题,定位类加载路径。
- 性能热点:快速定位应用的热点,生成火焰图。
- Webconsole:在线诊断,点开网页及时诊断线上应用。
使用方法
Arthas 是由阿里巴巴开源的一款强大的 Java 诊断工具,它可以帮助开发者在不修改代码、不重启应用的情况下,对线上问题进行快速诊断和定位。以下是 Arthas 的使用方法和一些常用命令的详解:
安装和启动 Arthas
- 下载 Arthas:
你可以通过以下命令下载 Arthas 的启动器arthas-boot.jar
:curl -O https://arthas.aliyun.com/arthas-boot.jar
- 启动 Arthas:
使用以下命令启动 Arthas,并选择需要诊断的目标 Java 进程:
启动后,Arthas 会列出所有 Java 进程,你可以选择需要诊断的进程编号进行连接。java -jar arthas-boot.jar
使用 Arthas 命令
以下是Arthas的一些常见命令及其参数使用详解:
1. dashboard
- 用途:展示当前系统的实时数据面板。
- 命令:
dashboard
- 参数:
-i <interval>
:设置刷新时间间隔,默认5000ms。-n <number>
:设置刷新次数。
- 详解:
dashboard
命令可以展示JVM的实时数据,包括线程、内存、GC等信息。可以通过参数-i
和-n
来调整刷新频率和次数。
2. thread
- 用途:查看当前JVM的线程堆栈信息。
- 命令:
thread
- 参数:
id
:查看指定线程的堆栈信息。-n <number>
:展示最忙的前N个线程并打印堆栈信息。-b
:找出被synchronized
关键字阻塞住的线程。
- 详解:
thread
命令可以查看所有线程的信息,或者通过参数-n
查看最忙的线程,或者通过-b
找出被阻塞的线程。
3. sc (Search Class)
- 用途:查找JVM中已加载的类信息。
- 命令:
sc -d *MathGame
- 参数:
-d
:展示类的详细信息。-E
:开启正则表达式匹配,默认为通配符匹配。
- 详解:
sc
命令用于查找匹配特定模式的类,并可以展示类的详细信息。
4. jad (Java Assembly Disassemble)
- 用途:反编译指定的类或方法。
- 命令:
jad demo.MathGame
- 参数:
-c:
:指定类加载器的hashcode。-E
:开启正则表达式匹配,默认为通配符匹配。
- 详解:
jad
命令可以将JVM中实际运行的class的byte code反编译成java代码,便于理解业务逻辑。
5. monitor
- 用途:方法执行监控。
- 命令:
monitor -c 120 *MathGame primeFactors
- 参数:
-c <seconds>
:设置统计周期,默认值为120秒。-E
:开启正则表达式匹配,默认为通配符匹配。
- 详解:
monitor
命令用于监控匹配特定类和方法的调用情况,包括调用次数、成功次数、失败次数等。
6. watch
- 用途:方法执行数据观测。
- 命令:
watch demo.MathGame primeFactors returnObj
- 参数:
-x <level>
:设置对象展开的层级,默认为1。-E
:开启正则表达式匹配,默认为通配符匹配。
- 详解:
watch
命令用于观察方法的参数、返回值和异常信息,通过编写OGNL表达式进行对应变量的查看。
7. trace
- 用途:统计方法的调用链路,并输出每个节点的耗时。
- 命令:
trace *MathGame run
- 参数:
-E
:开启正则表达式匹配,默认为通配符匹配。
- 详解:
trace
命令用于追踪方法的执行路径和性能开销,对于性能分析非常有用。
这些命令覆盖了从JVM监控、类加载信息查询到性能分析等多个方面,是Arthas工具的常用功能。通过这些命令,你可以有效地诊断和解决Java应用中的问题。
8. 退出 Arthas
- 如果只是退出当前的连接,可以用
quit
或者exit
命令。 - 如果想完全退出 Arthas,可以执行
stop
命令。
通过这些命令,你可以使用 Arthas 来监控和诊断 Java 应用的各种问题,包括性能瓶颈、死锁、内存泄漏等。Arthas 提供了一种强大的方式来诊断和监控 Java 应用,使得开发者能够快速定位和解决线上问题。
🔍 Arthas 如何帮助定位内存泄漏问题?
Arthas 是一个强大的 Java 诊断工具,它可以帮助我们定位内存泄漏问题。以下是使用 Arthas 定位内存泄漏问题的主要步骤和对应的命令行详解:
1. 监控整体内存状况
首先,使用 memory
命令定期检查 JVM 的内存状态,以识别是否有内存泄漏的迹象。关注 heap
、特别是 g1_old_gen
区域的使用率与增长趋势,因为这是大部分对象最终驻留的地方。如果发现某一块内存持续增长而不减少,这可能是内存泄漏的信号。
memory
这个命令会提供各个内存区域(如堆、非堆、G1区域等)的使用情况。
2. 生成堆转储文件
当怀疑存在内存泄漏时,使用 heapdump
命令创建堆转储文件,比如 heapdump /path/to/dump.hprof
。这会保存当前 JVM 堆内存的状态到一个文件中,便于后续分析。
heapdump /path/to/dump.hprof
这个命令会创建一个堆内存快照文件,之后可以使用 Eclipse Memory Analyzer (MAT) 等工具分析这个文件,查找内存泄漏的具体对象及其引用链路。
3. 分析堆转储文件
利用诸如 Eclipse Memory Analyzer (MAT) 等工具打开之前生成的堆转储文件,分析其中的对象数量、大小及引用链路。重点关注那些数量异常增多或单个对象占用内存过大的实例,这些往往是内存泄漏的源头。
4. 使用 --live
标志精确定位
在进行内存分析时,可以利用 profiler start --live
命令,确保只保留未被垃圾回收的对象。这有助于更精确地识别真正泄漏的对象,排除掉正常生命周期内会被清理的对象干扰。
5. 监控 profiler 自身内存占用
虽然不是直接排查应用内存泄漏的步骤,但通过 profiler meminfo
命令监控 Arthas Profiler 自身的内存使用情况,可以确保分析过程中 Profiler 本身对 JVM 的影响降到最低,避免误解分析结果。
通过以上步骤,结合 Arthas 提供的命令和外部分析工具,可以有效地定位并诊断项目中的内存泄漏问题或识别出占用内存过大的对象。记得每次操作后都要分析数据变化,对比不同时间点的结果,以便追踪问题的发展和定位确切的泄露源。
📊 如何解读Arthas生成的内存使用报告?
要解读Arthas生成的内存使用报告,我们可以遵循以下步骤和方法:
1. 使用memory
命令查看内存状态
memory
命令提供了当前JVM的内存使用情况,包括堆内存、非堆内存以及各细分区域的使用详情。这个命令对于识别内存是否泄漏及大致位置至关重要。
- 观察堆内存(heap):特别是老年代(g1_old_gen)的增长情况,因为长期存活的对象通常在此积累。
- 注意非堆内存(nonheap):特别是元空间(metaspace)的增长,过大的类元数据可能导致问题。
- 检查代码缓存(codeheap):是否有异常增长,这可能意味着即时编译的代码占用过多内存。
2. 分析heapdump
生成的堆转储文件
如果memory
命令显示内存有异常增长的趋势,可以使用heapdump
命令生成堆的快照,以便进行深入分析。
- 生成堆转储文件:
这个命令会创建一个堆内存快照文件,之后可以使用Eclipse Memory Analyzer (MAT)等工具分析这个文件,查找内存泄漏的具体对象及其引用链路。heapdump arthas-output/dump.hprof
3. 使用MAT工具分析堆转储文件
在MAT中,关注那些占用内存大且数量异常增多的对象。这些通常是内存泄漏的源头。通过分析这些对象的引用链,可以追溯到导致泄漏的代码位置,从而为解决问题提供线索。
4. 使用dashboard
命令查看实时数据面板
dashboard
命令提供了一个实时的数据面板,显示当前系统的实时数据,包括线程、内存、GC等信息。
- 实时监控内存使用情况:通过
dashboard
可以实时查看内存使用情况,特别是堆内存和非堆内存的变化。
5. 使用histogram
命令查看对象分布
histogram
命令可以展示当前JVM中对象的分布情况,按照类名和对象数量进行排序。这个命令可以帮助我们快速定位哪些对象占用了大量的内存,从而找到可能的内存泄露点。
- 查看对象分布:
这个命令会显示对象数量最多的前100个类的分布情况,帮助识别内存占用大的对象。histogram -h 100
通过上述步骤,结合Arthas提供的实时监控与诊断能力,以及专业分析工具的深度分析能力,可以有效地解读Arthas生成的内存使用报告,并定位内存泄漏问题。
使用Arthas诊断并定位CPU异常占用问题
要使用Arthas诊断并定位CPU异常占用问题,可以按照以下步骤操作:
第一步:确保Arthas环境准备就绪
- 下载并启动Arthas:
启动后,选择需要排查的JVM进程。curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar
第二步:排除GC影响
- 运行
dashboard
命令:
dashboard
命令用于整体展示进程所有线程、内存、GC等情况。关注Memory相关的信息,检查内存使用情况(usage)是否已满以及GC(垃圾回收)频率是否过高。如果GC频繁,可能说明存在内存泄露或不当的内存使用模式导致CPU被频繁用于GC操作。
第三步:定位高CPU消耗的线程
- 运行
thread
命令:
使用thread -n 8
命令来查看最繁忙的8个线程的堆栈信息。这些堆栈信息会展示线程当前主要停留在哪个方法上执行,从而帮助定位到CPU消耗较多的具体方法或代码块。
第四步:深入分析高CPU消耗线程
- 分析线程堆栈:
通过thread
命令输出的结果,可以识别出哪些线程占据了较高的CPU资源,并思考这些线程与程序的哪部分逻辑相关联。
第五步:使用其他Arthas命令进一步诊断
- 使用
jad
、watch
、ognl
命令:jad
命令用于反编译类,查看具体的方法实现。watch
命令用于观察方法的入参和返回值,以及方法执行时间,可以帮助识别慢方法的入参。ognl
命令用于执行OGNL表达式,可以直接查询类的静态字段值。
通过上述步骤,结合Arthas提供的强大诊断功能,可以逐步缩小问题范围,最终定位到造成CPU占用过高的具体原因,并据此采取相应的优化措施。这些步骤依据于已知的知识内容,能够帮助你有效地使用Arthas工具来诊断和修复CPU异常占用问题。