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

一、什么是Arthas

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

  • 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?

  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!

  • 是否有一个全局视角来查看系统的运行状况?

  • 有什么办法可以监控到JVM的实时运行状态?

  • 怎么快速定位应用的热点,生成火焰图?

二、如何下载

下载地址: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

$ 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

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

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


  • monitor

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


$ monitor -c 5 demo.MathGame primeFactors




  • trace

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


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


  • stack

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


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


  • jad

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

命令:jad xx.xx.xx.ClassA

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


  • jvm

查看当前JVM信息

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


  • vmoption

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


  • ognl

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


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



$ ognl '@demo.MathGame@random'

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


  • sc

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


  • heapdump

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


heapdump /tmp/dump.hprof



heapdump --live /tmp/dump.hprof


五、进阶使用

  • 火焰图

六、参考文档

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容