阿里重磅開源在線分析診斷工具Arthas(阿爾薩斯)


github地址:

Arthas

arthas

English version goes here.

Arthas 是Alibaba開源的Java診斷工具,深受開發者喜愛。

當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:

  1. 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
  2. 我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?
  3. 遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?
  4. 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
  5. 是否有一個全局視角來查看系統的運行狀況?
  6. 有什么辦法可以監控到JVM的實時運行狀態?

Arthas采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。

快速開始

Linux/Unix/Mac

安裝Arthas:

curl -L https://alibaba.github.io/arthas/install.sh | sh 

啟動Arthas:

./as.sh 

Windows

  1. 點擊 這里 下載最新的Arthas zip包
  2. 解壓縮zip包.
  3. 進入bin目錄
  4. 執行以下命令 as.bat $PID

文檔

社區正在進行英文版本的翻譯工作,如果您有興趣請在 這里留言。

案例展示

Dashboard

dashboard

Thread

一目了然的了解系統的狀態,哪些線程比較占cpu?他們到底在做什么?

  1.  
    $ thread -n 3
  2.  
    "as-command-execute-daemon" Id=29 cpuUsage=75% RUNNABLE
  3.  
    at sun.management.ThreadImpl.dumpThreads 0(Native Method)
  4.  
    at sun.management.ThreadImpl.getThreadInfo(ThreadImpl. java:440)
  5.  
    at com.taobao.arthas.core.command.monitor20 0.ThreadCommand$1.action(ThreadCommand.java:58)
  6.  
    at com.taobao.arthas.core.command.handler.AbstractCommandHandler.execute(AbstractCommandHandler. java:238)
  7.  
    at com.taobao.arthas.core.command.handler.DefaultCommandHandler.handleCommand(DefaultCommandHandler. java:67)
  8.  
    at com.taobao.arthas.core.server.ArthasServer$4.run(ArthasServer. java:276)
  9.  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor. java:1145)
  10.  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor. java:615)
  11.  
    at java.lang.Thread.run(Thread. java:745)
  12.  
     
  13.  
    Number of locked synchronizers = 1
  14.  
    - java.util.concurrent.ThreadPoolExecutor$Worker@6cd0b6f8
  15.  
     
  16.  
    "as-session-expire-daemon" Id=25 cpuUsage=24% TIMED_WAITING
  17.  
    at java.lang.Thread.sleep(Native Method)
  18.  
    at com.taobao.arthas.core.server.DefaultSessionManager$2.run(DefaultSessionManager. java:85)
  19.  
     
  20.  
    "Reference Handler" Id=2 cpuUsage=0% WAITING on java.lang.ref.Reference$Lock@69ba0f27
  21.  
    at java.lang.Object.wait(Native Method)
  22.  
    - waiting on java.lang.ref.Reference$Lock@69ba0f27
  23.  
    at java.lang.Object.wait(Object. java:503)
  24.  
    at java.lang.ref.Reference$ReferenceHandler.run(Reference. java:133)

jad

對類進行反編譯:

$ jad javax.servlet.Servlet

ClassLoader:
+-java.net.URLClassLoader@6108b2d7
  +-sun.misc.Launcher$AppClassLoader@18b4aac2
    +-sun.misc.Launcher$ExtClassLoader@1ddf84b8

Location:
/Users/xxx/work/test/lib/servlet-api.jar

/*
 * Decompiled with CFR 0_122.
 */
package javax.servlet;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public interface Servlet {
    public void init(ServletConfig var1) throws ServletException;

    public ServletConfig getServletConfig();

    public void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    public String getServletInfo();

    public void destroy();
}

sc

查找JVM中已經加載的類

  1.  
    $ sc -d org.springframework.web.context.support.XmlWebApplicationContext
  2.  
    class-info org.springframework.web.context.support.XmlWebApplicationContext
  3.  
    code-source /Users/xxx/work/test/WEB-INF/lib/spring-web- 3.2.11.RELEASE.jar
  4.  
    name org.springframework.web.context.support.XmlWebApplicationContext
  5.  
    isInterface false
  6.  
    isAnnotation false
  7.  
    isEnum false
  8.  
    isAnonymousClass false
  9.  
    isArray false
  10.  
    isLocalClass false
  11.  
    isMemberClass false
  12.  
    isPrimitive false
  13.  
    isSynthetic false
  14.  
    simple-name XmlWebApplicationContext
  15.  
    modifier public
  16.  
    annotation
  17.  
    interfaces
  18.  
    super-class +-org.springframework.web.context.support.AbstractRefreshableWebApplicationContext
  19.  
    +-org.springframework.context.support.AbstractRefreshableConfigApplicationContext
  20.  
    +-org.springframework.context.support.AbstractRefreshableApplicationContext
  21.  
    +-org.springframework.context.support.AbstractApplicationContext
  22.  
    +-org.springframework.core.io.DefaultResourceLoader
  23.  
    +-java.lang.Object
  24.  
    class-loader +-org.apache.catalina.loader.ParallelWebappClassLoader
  25.  
    +-java.net.URLClassLoader@6108b2d7
  26.  
    +-sun.misc.Launcher$AppClassLoader@18b4aac2
  27.  
    +-sun.misc.Launcher$ExtClassLoader@1ddf84b8
  28.  
    classLoaderHash 25131501
  29.  
     

stack

查看方法 test.arthas.TestStack#doGet 的調用堆棧:

  1.  
    $ stack test.arthas.TestStack doGet
  2.  
    Press Ctrl+C to abort.
  3.  
    Affect( class-cnt:1 , method-cnt:1) cost in 286 ms.
  4.  
    ts= 2018-09-18 10:11:45;thread_name=http-bio-8080-exec-10;id=d9;is_daemon=true;priority=5;TCCL=org.apache.catalina.loader.ParallelWebappClassLoader@25131501
  5.  
    @test.arthas.TestStack.doGet()
  6.  
    at javax.servlet.http.HttpServlet.service(HttpServlet. java:624)
  7.  
    at javax.servlet.http.HttpServlet.service(HttpServlet. java:731)
  8.  
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain. java:303)
  9.  
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain. java:208)
  10.  
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter. java:52)
  11.  
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain. java:241)
  12.  
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain. java:208)
  13.  
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain. java:241)
  14.  
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain. java:208)
  15.  
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve. java:220)
  16.  
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve. java:110)
  17.  
    ...
  18.  
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve. java:169)
  19.  
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve. java:103)
  20.  
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve. java:116)
  21.  
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter. java:451)
  22.  
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor. java:1121)
  23.  
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol. java:637)
  24.  
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint. java:316)
  25.  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor. java:1142)
  26.  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor. java:617)
  27.  
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread. java:61)
  28.  
    at java.lang.Thread.run(Thread. java:745)

Trace

觀察方法執行的時候那個子調用比較慢:

trace

Watch

觀察方法 test.arthas.TestWatch#doGet 執行的入參,僅當方法拋出異常時才輸出。

  1.  
    $ watch test.arthas.TestWatch doGet {params[ 0], throwExp} -e
  2.  
    Press Ctrl+C to abort.
  3.  
    Affect( class-cnt:1 , method-cnt:1) cost in 65 ms.
  4.  
    ts= 2018-09-18 10:26:28;result=@ArrayList[
  5.  
    @RequestFacade[org.apache.catalina.connector.RequestFacade@79f922b2],
  6.  
    @NullPointerException[java.lang.NullPointerException],
  7.  
    ]

Classloader

了解當前系統中有多少類加載器,以及每個加載器加載的類數量,幫助您判斷是否有類加載器泄露。

  1.  
    $ classloader
  2.  
    name numberOfInstances loadedCountTotal
  3.  
    BootstrapClassLoader 1 3346
  4.  
    com.taobao.arthas.agent. ArthasClassloader 1 1262
  5.  
    java.net. URLClassLoader 2 1033
  6.  
    org.apache.catalina.loader. ParallelWebappClassLoader 1 628
  7.  
    sun. reflect.DelegatingClassLoader 166 166
  8.  
    sun.misc. Launcher$AppClassLoader 1 31
  9.  
    com.alibaba.fastjson.util. ASMClassLoader 6 15
  10.  
    sun.misc. Launcher$ExtClassLoader 1 7
  11.  
    org.jvnet.hk2. internal.DelegatingClassLoader 2 2
  12.  
    sun. reflect.misc.MethodUtil 1 1

Web Console

web console


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM