阿里的java診斷來(lái)源了

在阿里巴巴內(nèi)部,有很多自研工具供開發(fā)者使用,其中有一款工具,是幾乎每個(gè)Java開發(fā)都使用過(guò)的工具,那就是Arthas,這是一款Java診斷工具,是一款牛逼帶閃電的工具。該工具已于2018年9月份開源。

GitHub地址:https://github.com/alibaba/arthas

用戶文檔:https://alibaba.github.io/arthas/

在日常開發(fā)中,你是否遇到過(guò)以下問題:

這個(gè)類從哪個(gè) jar 包加載的?為什么會(huì)報(bào)各種類相關(guān)的 Exception?

我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯(cuò)了?

遇到問題無(wú)法在線上 debug,難道只能通過(guò)加日志再重新發(fā)布嗎?

線上遇到某個(gè)用戶的數(shù)據(jù)處理有問題,但線上同樣無(wú)法 debug,線下無(wú)法重現(xiàn)!

是否有一個(gè)全局視角來(lái)查看系統(tǒng)的運(yùn)行狀況?

有什么辦法可以監(jiān)控到JVM的實(shí)時(shí)運(yùn)行狀態(tài)?

以上問題,通通可以通過(guò)Arthas來(lái)進(jìn)行問題診斷?。?!是不是很好很強(qiáng)大。

Arthas支持JDK 6+,采用命令行交互模式,同時(shí)提供豐富的Tab自動(dòng)補(bǔ)全功能,進(jìn)一步方便進(jìn)行問題的定位和診斷。

Arthas安裝

1、使用arthas-boot安裝

下載arthas-boot.jar,然后用java -jar的方式啟動(dòng):

打印幫助信息:

如果下載速度比較慢,可以使用aliyun的鏡像:

2、使用as.sh安裝

Arthas 支持在 Linux/Unix/Mac 等平臺(tái)上一鍵安裝,請(qǐng)復(fù)制以下內(nèi)容,并粘貼到命令行中,敲 回車 執(zhí)行即可:

上述命令會(huì)下載啟動(dòng)腳本文件 as.sh 到當(dāng)前目錄,你可以放在任何地方或?qū)⑵浼尤氲?$PATH 中。

直接在shell下面執(zhí)行./as.sh,就會(huì)進(jìn)入交互界面。

也可以執(zhí)行./as.sh -h來(lái)獲取更多參數(shù)信息。

快速入門

1. 啟動(dòng)Demo

arthas-demo是一個(gè)簡(jiǎn)單的程序,每隔一秒生成一個(gè)隨機(jī)數(shù),再執(zhí)行質(zhì)因式分解,并打印出分解結(jié)果。

2. 啟動(dòng)arthas

在命令行下面執(zhí)行:

執(zhí)行該程序的用戶需要和目標(biāo)進(jìn)程具有相同的權(quán)限。比如以admin用戶來(lái)執(zhí)行:sudo su admin && java -jar arthas-boot.jar或sudo -u admin -EH java -jar arthas-boot.jar。

如果attatch不上目標(biāo)進(jìn)程,可以查看~/logs/arthas/目錄下的日志。

如果下載速度比較慢,可以使用aliyun的鏡像:java -jar arthas-boot.jar --repo-mirror aliyun --use-http

java -jar arthas-boot.jar -h打印更多參數(shù)信息。

選擇應(yīng)用java進(jìn)程:

Demo進(jìn)程是第2個(gè),則輸入2,再輸入回車/enter。Arthas會(huì)attach到目標(biāo)進(jìn)程上,并輸出日志:

3. 查看dashboard

輸入dashboard,按enter/回車,會(huì)展示當(dāng)前進(jìn)程的信息,按ctrl+c可以中斷執(zhí)行。

4. 通過(guò)sysenv命令來(lái)獲取到進(jìn)程的Main Class

5. 通過(guò)jad來(lái)反編繹Main Class

6. watch

通過(guò)watch命令來(lái)查看demo.MathGame#primeFactors函數(shù)的返回值:

5. 退出arthas

如果只是退出當(dāng)前的連接,可以用quit或者exit命令。Attach到目標(biāo)進(jìn)程上的arthas還會(huì)繼續(xù)運(yùn)行,端口會(huì)保持開放,下次連接時(shí)可以直接連接上。

如果想完全退出arthas,可以執(zhí)行shutdown命令。

常用命令

基礎(chǔ)命令

help——查看命令幫助信息

cls——清空當(dāng)前屏幕區(qū)域

session——查看當(dāng)前會(huì)話的信息

reset——重置增強(qiáng)類,將被 Arthas 增強(qiáng)過(guò)的類全部還原,Arthas 服務(wù)端關(guān)閉時(shí)會(huì)重置所有增強(qiáng)過(guò)的類

version——輸出當(dāng)前目標(biāo) Java 進(jìn)程所加載的 Arthas 版本號(hào)

quit——退出當(dāng)前 Arthas 客戶端,其他 Arthas 客戶端不受影響

shutdown——關(guān)閉 Arthas 服務(wù)端,所有 Arthas 客戶端全部退出

keymap——Arthas快捷鍵列表及自定義快捷鍵

jvm相關(guān)

dashboard——當(dāng)前系統(tǒng)的實(shí)時(shí)數(shù)據(jù)面板

thread——查看當(dāng)前 JVM 的線程堆棧信息

jvm——查看當(dāng)前 JVM 的信息

sysprop——查看和修改JVM的系統(tǒng)屬性

New! getstatic——查看類的靜態(tài)屬性

class/classloader相關(guān)

sc——查看JVM已加載的類信息

sm——查看已加載類的方法信息

dump——dump 已加載類的 byte code 到特定目錄

redefine——加載外部的.class文件,redefine到JVM里

jad——反編譯指定已加載類的源碼

classloader——查看classloader的繼承樹,urls,類加載信息,使用classloader去getResource

monitor/watch/trace相關(guān)

monitor——方法執(zhí)行監(jiān)控

watch——方法執(zhí)行數(shù)據(jù)觀測(cè)

trace——方法內(nèi)部調(diào)用路徑,并輸出方法路徑上的每個(gè)節(jié)點(diǎn)上耗時(shí)

stack——輸出當(dāng)前方法被調(diào)用的調(diào)用路徑

tt——方法執(zhí)行數(shù)據(jù)的時(shí)空隧道,記錄下指定方法每次調(diào)用的入?yún)⒑头祷匦畔?,并能?duì)這些不同的時(shí)間下調(diào)用進(jìn)行觀測(cè)

請(qǐng)注意,這些命令,都通過(guò)字節(jié)碼增強(qiáng)技術(shù)來(lái)實(shí)現(xiàn)的,會(huì)在指定類的方法中插入一些切面來(lái)實(shí)現(xiàn)數(shù)據(jù)統(tǒng)計(jì)和觀測(cè),因此在線上、預(yù)發(fā)使用時(shí),請(qǐng)盡量明確需要觀測(cè)的類、方法以及條件,診斷結(jié)束要執(zhí)行 shutdown 或?qū)⒃鰪?qiáng)過(guò)的類執(zhí)行 reset 命令。

options

options——查看或設(shè)置Arthas全局開關(guān)

管道

? ? ? ? Arthas支持使用管道對(duì)上述命令的結(jié)果進(jìn)行進(jìn)一步的處理,如sm org.apache.log4j.Logger | grep

grep——搜索滿足條件的結(jié)果

plaintext——將命令的結(jié)果去除顏色

wc——按行統(tǒng)計(jì)輸出結(jié)果

以上,就是關(guān)于Arthas的簡(jiǎn)單介紹,要想真正的融會(huì)貫通,真正的把他作為一個(gè)排查問題的利器,還需要自己動(dòng)手實(shí)踐下!所謂實(shí)踐出真知。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在阿里巴巴內(nèi)部,有很多自研工具供開發(fā)者使用,其中有一款工具,是幾乎每個(gè)Java開發(fā)都使用過(guò)的工具,那就是Artha...
    溫馭臣閱讀 845評(píng)論 0 0
  • 在一個(gè)方法內(nèi)部定義的變量都存儲(chǔ)在棧中,當(dāng)這個(gè)函數(shù)運(yùn)行結(jié)束后,其對(duì)應(yīng)的棧就會(huì)被回收,此時(shí),在其方法體中定義的變量將不...
    Y了個(gè)J閱讀 4,547評(píng)論 1 14
  • 0、前言 讀完本文,你將了解到: 一、為什么說(shuō)Jabalpur語(yǔ)言是跨平臺(tái)的 二、Java虛擬機(jī)啟動(dòng)、加載類過(guò)程分...
    vivi_wong閱讀 1,378評(píng)論 0 10
  • 我仿佛是一只小鳥,在天空中飛翔。我又仿佛是一條小魚,在大海里自由自在的游來(lái)游去。不管我是什么,我都有一顆向往...
    閆迪_df77閱讀 256評(píng)論 0 0
  • 情人節(jié)我沒有收到玫瑰,或是巧克力我走在路上雨水綿綿絮語(yǔ)流浪漢走向我,指甲發(fā)灰他遞給我一片花瓣玫瑰花瓣泥水浸染,鮮紅...
    北海道章魚酥閱讀 811評(píng)論 2 3

友情鏈接更多精彩內(nèi)容