關于arthas調研

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 自動補全功能,進一步方便進行問題的定位和診斷。

運行原理:

image

命令列表:

image

鏈接: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實現。

  1. premain是在 Java SE 5中新引入的 ,開發(fā)者只能在 premain 當中施展想象力,所作的 Instrumentation 也僅限與 main 函數執(zhí)行前,這樣的方式存在一定的局限性。
  2. 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í)行過程如下:

image
動圖鏈接:https://images.cnblogs.com/cnblogs_com/royi123/548096/o_609956274533007378.gif

java探針

其實就是javaagent,借助jvmti機制與客戶jar包一起部署上線,采集性能數據發(fā)送到數據中心。數據中心提供可視化界面直觀展現給客戶,幫助定位性能問題。

探針客戶端技術棧比較窄:

1、jvmti

2、字節(jié)碼編輯【asm或者byte-buddy(https://github.com/apache/skywalking)】

3、classloader類加載機制

4、多線程

學習demo:

https://github.com/CallMeJiaGu/iarthas

https://github.com/cderlearner/arthas-learning

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Instrumentation 簡介 利用 Java 代碼,即 java.lang.instrument 做動態(tài) ...
    timothyue1閱讀 2,109評論 0 2
  • Java動態(tài)追蹤技術探究 在Java虛擬機中,字符串常量到底存放在哪 一次生產 CPU 100% 排查優(yōu)化實踐 聊...
    passiontim閱讀 4,298評論 0 38
  • Java動態(tài)追蹤技術探究 在Java虛擬機中,字符串常量到底存放在哪 一次生產 CPU 100% 排查優(yōu)化實踐 聊...
    星海辰光大人閱讀 797評論 0 2
  • 感謝溫全燕導師,感謝最美助教團,感謝一起生死與共的伙伴們,這是一場覺醒和感恩的旅程。能夠一起度過,莫大的...
    小龍女安閱讀 463評論 0 1
  • 《奇跡課程》之於海倫(Helen Schucman: Her Study and Practice of "A C...
    臺Jennifer閱讀 593評論 0 3

友情鏈接更多精彩內容