github地址:
Arthas
English version goes here.
Arthas
是Alibaba開源的Java診斷工具,深受開發者喜愛。
當你遇到以下類似問題而束手無策時,Arthas
可以幫助你解決:
- 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
- 我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?
- 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
- 是否有一個全局視角來查看系統的運行狀況?
- 有什么辦法可以監控到JVM的實時運行狀態?
Arthas
采用命令行交互模式,同時提供豐富的 Tab
自動補全功能,進一步方便進行問題的定位和診斷。
快速開始
Linux/Unix/Mac
安裝Arthas:
curl -L https://alibaba.github.io/arthas/install.sh | sh
啟動Arthas:
./as.sh
Windows
- 點擊 這里 下載最新的Arthas zip包
- 解壓縮zip包.
- 進入bin目錄
- 執行以下命令
as.bat $PID
文檔
社區正在進行英文版本的翻譯工作,如果您有興趣請在 這里留言。
案例展示
Dashboard
Thread
一目了然的了解系統的狀態,哪些線程比較占cpu?他們到底在做什么?
-
$ thread -n 3
-
"as-command-execute-daemon" Id=29 cpuUsage=75% RUNNABLE
-
at sun.management.ThreadImpl.dumpThreads 0(Native Method)
-
at sun.management.ThreadImpl.getThreadInfo(ThreadImpl. java:440)
-
at com.taobao.arthas.core.command.monitor20 0.ThreadCommand$1.action(ThreadCommand.java:58)
-
at com.taobao.arthas.core.command.handler.AbstractCommandHandler.execute(AbstractCommandHandler. java:238)
-
at com.taobao.arthas.core.command.handler.DefaultCommandHandler.handleCommand(DefaultCommandHandler. java:67)
-
at com.taobao.arthas.core.server.ArthasServer$4.run(ArthasServer. java:276)
-
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor. java:1145)
-
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor. java:615)
-
at java.lang.Thread.run(Thread. java:745)
-
-
Number of locked synchronizers = 1
-
- java.util.concurrent.ThreadPoolExecutor$Worker@6cd0b6f8
-
-
"as-session-expire-daemon" Id=25 cpuUsage=24% TIMED_WAITING
-
at java.lang.Thread.sleep(Native Method)
-
at com.taobao.arthas.core.server.DefaultSessionManager$2.run(DefaultSessionManager. java:85)
-
-
"Reference Handler" Id=2 cpuUsage=0% WAITING on java.lang.ref.Reference$Lock@69ba0f27
-
at java.lang.Object.wait(Native Method)
-
- waiting on java.lang.ref.Reference$Lock@69ba0f27
-
at java.lang.Object.wait(Object. java:503)
-
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中已經加載的類
-
$ sc -d org.springframework.web.context.support.XmlWebApplicationContext
-
class-info org.springframework.web.context.support.XmlWebApplicationContext
-
code-source /Users/xxx/work/test/WEB-INF/lib/spring-web- 3.2.11.RELEASE.jar
-
name org.springframework.web.context.support.XmlWebApplicationContext
-
isInterface false
-
isAnnotation false
-
isEnum false
-
isAnonymousClass false
-
isArray false
-
isLocalClass false
-
isMemberClass false
-
isPrimitive false
-
isSynthetic false
-
simple-name XmlWebApplicationContext
-
modifier public
-
annotation
-
interfaces
-
super-class +-org.springframework.web.context.support.AbstractRefreshableWebApplicationContext
-
+-org.springframework.context.support.AbstractRefreshableConfigApplicationContext
-
+-org.springframework.context.support.AbstractRefreshableApplicationContext
-
+-org.springframework.context.support.AbstractApplicationContext
-
+-org.springframework.core.io.DefaultResourceLoader
-
+-java.lang.Object
-
class-loader +-org.apache.catalina.loader.ParallelWebappClassLoader
-
+-java.net.URLClassLoader@6108b2d7
-
+-sun.misc.Launcher$AppClassLoader@18b4aac2
-
+-sun.misc.Launcher$ExtClassLoader@1ddf84b8
-
classLoaderHash 25131501
-
stack
查看方法 test.arthas.TestStack#doGet
的調用堆棧:
-
$ stack test.arthas.TestStack doGet
-
Press Ctrl+C to abort.
-
Affect( class-cnt:1 , method-cnt:1) cost in 286 ms.
-
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
-
@test.arthas.TestStack.doGet()
-
at javax.servlet.http.HttpServlet.service(HttpServlet. java:624)
-
at javax.servlet.http.HttpServlet.service(HttpServlet. java:731)
-
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain. java:303)
-
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain. java:208)
-
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter. java:52)
-
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain. java:241)
-
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain. java:208)
-
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain. java:241)
-
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain. java:208)
-
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve. java:220)
-
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve. java:110)
-
...
-
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve. java:169)
-
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve. java:103)
-
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve. java:116)
-
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter. java:451)
-
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor. java:1121)
-
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol. java:637)
-
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint. java:316)
-
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor. java:1142)
-
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor. java:617)
-
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread. java:61)
-
at java.lang.Thread.run(Thread. java:745)
Trace
觀察方法執行的時候那個子調用比較慢:
Watch
觀察方法 test.arthas.TestWatch#doGet
執行的入參,僅當方法拋出異常時才輸出。
-
$ watch test.arthas.TestWatch doGet {params[ 0], throwExp} -e
-
Press Ctrl+C to abort.
-
Affect( class-cnt:1 , method-cnt:1) cost in 65 ms.
-
ts= 2018-09-18 10:26:28;result=
-
-
-
]
Classloader
了解當前系統中有多少類加載器,以及每個加載器加載的類數量,幫助您判斷是否有類加載器泄露。
-
$ classloader
-
name numberOfInstances loadedCountTotal
-
BootstrapClassLoader 1 3346
-
com.taobao.arthas.agent. ArthasClassloader 1 1262
-
java.net. URLClassLoader 2 1033
-
org.apache.catalina.loader. ParallelWebappClassLoader 1 628
-
sun. reflect.DelegatingClassLoader 166 166
-
sun.misc. Launcher$AppClassLoader 1 31
-
com.alibaba.fastjson.util. ASMClassLoader 6 15
-
sun.misc. Launcher$ExtClassLoader 1 7
-
org.jvnet.hk2. internal.DelegatingClassLoader 2 2
-
sun. reflect.misc.MethodUtil 1 1
Web Console