引言
在java开发中,我们经常会遇到各种性能问题、内存泄漏、线程阻塞等问题。这些问题往往难以通过常规的日志和监控工具来定位和解决。arthas作为一款开源的java诊断工具,提供了强大的实时监控和诊断功能,能够帮助开发者快速定位和解决这些问题。本文将详细介绍arthas的安装、基本使用以及一些常用命令,帮助读者快速上手并应用于实际开发中。
1. arthas简介
arthas是阿里巴巴开源的一款java诊断工具,支持jdk 6+,能够在不重启应用的情况下,实时监控和诊断java应用的运行状态。arthas提供了丰富的命令集,可以帮助开发者快速定位性能瓶颈、内存泄漏、线程阻塞等问题。
1.1 arthas的主要功能
- 实时监控:可以实时查看jvm的运行状态,包括线程、内存、gc等信息。
- 动态追踪:可以在不修改代码的情况下,动态追踪方法的调用情况。
- 热更新:可以在不重启应用的情况下,动态修改类的字节码。
- 反编译:可以反编译已加载的类,查看其源代码。
- 性能分析:可以分析方法的执行时间、调用次数等性能指标。
2. 安装arthas
2.1 下载arthas
arthas的安装非常简单,只需要下载其启动脚本即可。可以通过以下命令下载:
curl -o https://arthas.aliyun.com/arthas-boot.jar
2.2 启动arthas
下载完成后,可以通过以下命令启动arthas:
java -jar arthas-boot.jar
启动后,arthas会列出当前系统中所有的java进程,用户可以选择需要诊断的进程进行连接。
$ java -jar arthas-boot.jar * [1]: 35542 [2]: 71560 math-game.jar
选择对应的进程编号,arthas会连接到目标进程并启动诊断会话。
3. 快速入门
3.1 启动示例应用
为了更好地演示arthas的使用,我们可以先启动一个简单的java应用math-game
。这个应用每隔一秒生成一个随机数,并对其进行质因数分解。
curl -o https://arthas.aliyun.com/math-game.jar java -jar math-game.jar
3.2 查看dashboard
连接成功后,可以通过dashboard
命令查看当前进程的运行状态,包括线程、内存、gc等信息。
$ dashboard id name group priori state %cpu time interru daemon 17 pool-2-thread-1 system 5 waitin 67 0:0 false false 27 timer-for-arthas-dashb system 10 runnab 32 0:0 false true ...
3.3 获取main class
通过thread
命令可以获取到math-game
进程的main class。
$ thread 1 | grep 'main(' at demo.mathgame.main(mathgame.java:17)
3.4 反编译main class
通过jad
命令可以反编译main class,查看其源代码。
$ jad demo.mathgame classloader: +-sun.misc.launcher$appclassloader@3d4eac69 +-sun.misc.launcher$extclassloader@66350f69 location: /tmp/math-game.jar /* * decompiled with cfr 0_132. */ package demo; import java.io.printstream; import java.util.arraylist; import java.util.iterator; import java.util.list; import java.util.random; import java.util.concurrent.timeunit; public class mathgame { private static random random = new random(); private int illegalargumentcount = 0; public static void main(string[] args) throws interruptedexception { mathgame game = new mathgame(); do { game.run(); timeunit.seconds.sleep(1l); } while (true); } public void run() throws interruptedexception { try { int number = random.nextint(); list<integer> primefactors = this.primefactors(number); mathgame.print(number, primefactors); } catch (exception e) { system.out.println(string.format("illegalargumentcount:%3d, ", this.illegalargumentcount) + e.getmessage()); } } public static void print(int number, list<integer> primefactors) { stringbuffer sb = new stringbuffer("" + number + "="); iterator<integer> iterator = primefactors.iterator(); while (iterator.hasnext()) { int factor = iterator.next(); sb.append(factor).append('*'); } if (sb.charat(sb.length() - 1) == '*') { sb.deletecharat(sb.length() - 1); } system.out.println(sb); } public list<integer> primefactors(int number) { if (number < 2) { ++this.illegalargumentcount; throw new illegalargumentexception("number is: " + number + ", need >= 2"); } arraylist<integer> result = new arraylist<integer>(); int i = 2; while (i <= number) { if (number % i == 0) { result.add(i); number /= i; i = 2; continue; } ++i; } return result; } }
3.5 监控方法返回值
通过watch
命令可以监控demo.mathgame#primefactors
方法的返回值。
$ watch demo.mathgame primefactors returnobj press ctrl+c to abort. affect(class-cnt:1 , method-cnt:1) cost in 107 ms. ts=2018-11-28 19:22:30; [cost=1.715367ms] result=null ts=2018-11-28 19:22:31; [cost=0.185203ms] result=null ts=2018-11-28 19:22:32; [cost=19.012416ms] result=@arraylist[ @integer[5], @integer[47], @integer[2675531], ] ...
3.6 退出arthas
如果只是退出当前的连接,可以使用quit
或exit
命令。如果想完全退出arthas,可以执行stop
命令。
$ stop
4. 进阶使用
4.1 动态追踪方法调用
arthas提供了trace
命令,可以动态追踪方法的调用情况,帮助开发者分析方法的执行时间和调用次数。
$ trace demo.mathgame run press ctrl+c to abort. affect(class-cnt:1 , method-cnt:1) cost in 107 ms. ts=2018-11-28 19:22:30; [cost=1.715367ms] result=null ts=2018-11-28 19:22:31; [cost=0.185203ms] result=null ts=2018-11-28 19:22:32; [cost=19.012416ms] result=@arraylist[ @integer[5], @integer[47], @integer[2675531], ] ...
4.2 热更新代码
arthas支持在不重启应用的情况下,动态修改类的字节码。通过redefine
命令,可以将修改后的类重新加载到jvm中。
$ redefine /path/to/new/mathgame.class
4.3 性能分析
通过profiler
命令,可以对java应用进行性能分析,生成火焰图,帮助开发者快速定位性能瓶颈。
$ profiler start $ profiler stop
5. 总结
arthas作为一款强大的java诊断工具,提供了丰富的命令集和实时监控功能,能够帮助开发者快速定位和解决java应用中的各种问题。通过本文的介绍,读者可以快速上手arthas,并将其应用于实际开发中。无论是性能分析、内存泄漏排查,还是动态追踪方法调用,arthas都能提供强大的支持。
以上就是java诊断工具arthas的快速入门与实践的详细内容,更多关于java诊断工具arthas的资料请关注代码网其它相关文章!
发表评论