JAVA进阶

阿里开源java性能诊断医生-Arthas

2020-03-10  本文已影响0人  我有一只喵喵

一、什么是Arthas

官方介绍:Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

二、如何下载

下载地址:https://github.com/alibaba/arthas/releases

三、如何使用

可以直接执行命令,选择需要attach的java进程回车


java -jar arthas-boot.jar

在执行该命令时可能发生异常,这里记录几点我遇到的问题

1.选择了java进程回车后报错


[ERROR] Start arthas failed, exception stack trace:

com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded

        at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)

        at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:78)

        at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:250)

        at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:85)

        at com.taobao.arthas.core.Arthas.<init>(Arthas.java:28)

        at com.taobao.arthas.core.Arthas.main(Arthas.java:123)



解决:在对应JAVA进程启动时添加JVM参数 -XX:+StartAttachListener

2.选择了java进程回车后报错


[ERROR] Start arthas failed, exception stack trace:

java.io.IOException: well-known file /tmp/.java_pid87449 is not secure: file should be owned by the current user (which is 0) but is owned by 30001

        at sun.tools.attach.LinuxVirtualMachine.checkPermissions(Native Method)

        at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:117)

        at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:78)

        at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:250)

        at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:85)

        at com.taobao.arthas.core.Arthas.<init>(Arthas.java:28)

        at com.taobao.arthas.core.Arthas.main(Arthas.java:123)

[ERROR] attach fail, targetPid: 87449



该问题发生的原因是执行该程序的用户需要和目标进程具有相同的权限。

四、常用命令


$ 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

11     AsyncAppender-Worker-a system         9      WAITIN 0       0:0    false   true

9      Attach Listener        system         9      RUNNAB 0       0:0    false   true

3      Finalizer              system         8      WAITIN 0       0:0    false   true

2      Reference Handler      system         10     WAITIN 0       0:0    false   true

4      Signal Dispatcher      system         9      RUNNAB 0       0:0    false   true

26     as-command-execute-dae system         10     TIMED_ 0       0:0    false   true

13     job-timeout            system         9      TIMED_ 0       0:0    false   true

1      main                   main           5      TIMED_ 0       0:0    false   false

14     nioEventLoopGroup-2-1  system         10     RUNNAB 0       0:0    false   false

18     nioEventLoopGroup-2-2  system         10     RUNNAB 0       0:0    false   false

23     nioEventLoopGroup-2-3  system         10     RUNNAB 0       0:0    false   false

15     nioEventLoopGroup-3-1  system         10     RUNNAB 0       0:0    false   false

Memory             used   total max    usage GC

heap               32M    155M  1820M  1.77% gc.ps_scavenge.count  4

ps_eden_space      14M    65M   672M   2.21% gc.ps_scavenge.time(m 166

ps_survivor_space  4M     5M    5M           s)

ps_old_gen         12M    85M   1365M  0.91% gc.ps_marksweep.count 0

nonheap            20M    23M   -1           gc.ps_marksweep.time( 0

code_cache         3M     5M    240M   1.32% ms)

Runtime

os.name                Mac OS X

os.version             10.13.4

java.version           1.8.0_162

java.home              /Library/Java/JavaVir

                       tualMachines/jdk1.8.0

                       _162.jdk/Contents/Hom

                       e/jre

通过该仪表盘我们可以获取到

1.对应进程中线程信息,可以直观看到哪些线程占用的CPU较高

2.JVM内存使用情况,包括年轻带(伊甸区,存活区),老年带,元空间(非堆)的GC情况


查看当前线程信息,查看线程的堆栈

命令:thread -n 3 ->打印当前最忙的top3线程


方法执行监控,可以实时监控某个方法的执行耗时


$ monitor -c 5 demo.MathGame primeFactors




方法内部调用路径,并输出方法路径上的每个节点上耗时,可以直接根据执行时间进行过滤


$ trace demo.MathGame run '#cost > 10'


输出当前方法被调用的调用路径,可以直接根据执行时间进行过滤


$ stack demo.MathGame primeFactors '#cost>5'


将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻.

命令:jad xx.xx.xx.ClassA

当存在多个源码时,可以通过-c 指定classLoad


查看当前JVM信息

通过此命令可以直接获取当前死锁的线程数,JVM当前活跃的线程数等


查看,更新VM诊断相关的参数


执行ognl表达式,可以查看类的静态属性、执行类的静态函数等等,例如


$ ognl '@java.lang.System@out.println("hello")'



$ ognl '@demo.MathGame@random'

同理,如若存在多个相同类路径代码,则使用-c参数指定classload


查看JVM已加载的类信息,可以打印类的详细信息,打印出类的Field信息等


dump java heap, 类似jmap命令的heap dump功能。


heapdump /tmp/dump.hprof



heapdump --live /tmp/dump.hprof


五、进阶使用

六、参考文档

https://alibaba.github.io/arthas/quick-start.html

上一篇下一篇

猜你喜欢

热点阅读