Arthas介紹
Arthas 是Alibaba開源的Java診斷工具,深受開發(fā)者喜愛。
當你遇到以下類似問題而束手無策時,Arthas可以幫助你解決:
- 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
- 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎?
- 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
- 是否有一個全局視角來查看系統(tǒng)的運行狀況?
- 有什么辦法可以監(jiān)控到JVM的實時運行狀態(tài)?
Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷。
運行原理:
命令列表:
鏈接:https://github.com/alibaba/arthas/blob/master/README_CN.md
預備知識
什么是JVMTI
JVMTI 的全稱是 JVM Tools Interface,是Java虛擬機提供的一整套后門。通過這套后門可以對虛擬機方方面面進行監(jiān)控,分析,甚至干預虛擬機的運行。JVMTI 本質上是在JVM內部的許多事件進行了埋點。通過這些埋點可以給外部提供當前上下文的一些信息。它是分析工具與調試器的基礎。
什么是Instrumentation
雖然java提供了JVMTI,但是對應的agent需要用C/C++開發(fā),對java開發(fā)者而言并不是非常友好。因此在Java SE 5的新特性中加入了Instrumentation機制。有了 Instrumentation,開發(fā)者可以構建一個基于Java編寫的Agent來監(jiān)控或者操作JVM了,比如替換或者修改某些類的定義等。
JavaAgent 的兩種方式
在 Java 中實現Instrumentation有兩種方式:在類執(zhí)行前通過premain來執(zhí)行 , 或者在啟動執(zhí)行后通過agentMain實現。
- premain是在 Java SE 5中新引入的 ,開發(fā)者只能在 premain 當中施展想象力,所作的 Instrumentation 也僅限與 main 函數執(zhí)行前,這樣的方式存在一定的局限性。
- Java SE 6 針對這種狀況做出了改進,開發(fā)者可以在 main 函數開始執(zhí)行以后,再啟動自己的 Instrumentation 程序,這種方式通過agentMain。
Java attach
在Java SE 5中是通過指定premain所在的jar來啟動虛擬機,而Java SE 6 通過發(fā)送命令到目標虛擬機,讓目標虛擬機再load jar,那么這個過程比如涉及到虛擬機之間的通信。Java SE 6 就是通過Java attach 來實現兩個主機之間的通信的。
ASM / Java assist
Java是軟件開發(fā)人員能讀懂的語言,class字節(jié)碼是JVM能讀懂的語言,class字節(jié)碼最終會被JVM解釋成機器能讀懂的語言。無論哪種語言,都是人創(chuàng)造的。所以,理論上(實際上也確實如此)人能讀懂上述任何一種語言,既然能讀懂,自然能修改。只要我們愿意,我們完全可以跳過Java編譯器,直接寫字節(jié)碼文件,只不過這并不符合時代的發(fā)展罷了,畢竟高級語言設計之始就是為我們人類所服務,其開發(fā)效率也比機器語言高很多。
對于人類來說,字節(jié)碼文件的可讀性遠遠沒有Java代碼高。盡管如此,還是有一些杰出的程序員們創(chuàng)造出了可以用來直接編輯字節(jié)碼的框架,提供接口可以讓我們方便地操作字節(jié)碼文件,進行注入修改類的方法,動態(tài)創(chuàng)造一個新的類等等操作。其中最著名的框架應該就是ASM了,cglib、Spring等框架中對于字節(jié)碼的操作就建立在ASM之上。
ASM
簡單的說,ASM 可以讀取解析class文件內容,并提供接口讓你可以對class文件字節(jié)碼內容進行CRUD操作。http://www.itdecent.cn/p/a85e8f83fa14
字節(jié)碼初探
1 https://www.cnblogs.com/royi123/p/3569511.html
2 http://www.itdecent.cn/p/9f09a0c21542
基于棧的Hotspot的執(zhí)行過程如下:

java探針
其實就是javaagent,借助jvmti機制與客戶jar包一起部署上線,采集性能數據發(fā)送到數據中心。數據中心提供可視化界面直觀展現給客戶,幫助定位性能問題。
探針客戶端技術棧比較窄:
1、jvmti
2、字節(jié)碼編輯【asm或者byte-buddy(https://github.com/apache/skywalking)】
3、classloader類加載機制
4、多線程