91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中Arthas的作用及使用方法

發布時間:2021-06-28 15:02:17 來源:億速云 閱讀:1215 作者:chen 欄目:大數據

本篇內容介紹了“Java中Arthas的作用及使用方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1 簡介

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

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

  • 這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?

  • 我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?

  • 遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?

  • 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!

  • 是否有一個全局視角來查看系統的運行狀況?

  • 有什么辦法可以監控到JVM的實時運行狀態?

Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同時提供豐富的 Tab 自動補全功能,進一步方便進行問題的定位和診斷

2 主要功能

Arthas提供的功能主要可以分為以下3個方面:

  • (1) 信息監控

    • 進程運行基本信息:內存、CPU占用、線程信息、線程堆棧、線程數統計、環境變量信息

    • 對象信息:類對象靜態屬性、 Mbean 的屬性信息、已加載類信息、類加載器、類方法信息

  • (2) 方法調用

    • 方法調用入參、返回值查看

    • 方法被調用的調用路徑、調用耗時、方法調用次數、成功次數、失敗次數等統計

    • 記錄和重做方法調用

  • (3) 類文件處理

    • dump已加載類的字節碼、字節碼反編譯、類編譯、類重新熱加載

3 安裝和使用

3.1 安裝

下載arthas-boot.jar,然后用java -jar的方式啟動:

wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

然后輸入進程對應編號,進入Arthas的命令交互界面即可使用:

Java中Arthas的作用及使用方法

打印幫助信息:

java -jar arthas-boot.jar -h

3.2 使用

下面介紹Arthas的一些常用的命令和用法和原理,看看是如何解決我們實際中的問題的,命令詳情可以參考Arthas的官方文檔

(1) 整體dashboard數據

在arthas的命令行界面,輸入dashboard命令,會實時展示當前tomcat的多線程狀態、JVM各區域、GC情況等信息 Java中Arthas的作用及使用方法

(2) 查看線程監控

輸入thread命令,會顯示所有線程的狀態信息 輸入thread -n 3會顯示當前最忙的3個線程,可以用來排查線程CPU消耗 輸入thread -b 會顯示當前處于BLOCKED狀態的線程,可以排查線程鎖的問題 Java中Arthas的作用及使用方法

(3) JVM監控

輸入jvm命令,查看jvm詳細的性能數據 Java中Arthas的作用及使用方法

(4) 觀察方法參數、返回值

有時排查問題中我們需要查看參數,返回值,通常的需要加日志打印,比較繁瑣,基于watch命令我們可以很方便做到這一切

$ watch demo.MathGame primeFactors "{params,returnObj}" -x 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 44 ms.
ts=2018-12-03 19:16:51; [cost=1.280502ms] result=@ArrayList[
    @Object[][
        @Integer[535629513],
    ],
    @ArrayList[
        @Integer[3],
        @Integer[19],
        @Integer[191],
        @Integer[49199],
    ],
]

(5) 觀察方法調用路徑,耗時詳情

有時會遇到服務卡頓,想排查到底哪個步驟耗時比較久,通常做法是加日志,使用trace命令可以很方便解決這個問題:

$ trace demo.MathGame run
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 42 ms.
`---ts=2018-12-04 00:44:17;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
    `---[10.611029ms] demo.MathGame:run()
        +---[0.05638ms] java.util.Random:nextInt()
        +---[10.036885ms] demo.MathGame:primeFactors()
        `---[0.170316ms] demo.MathGame:print()

4 實現原理

整體宏觀模塊調用圖如下: Java中Arthas的作用及使用方法

篇幅原因,下面對其其中涉及的比較核心的2個原理進行簡單介紹:

(1) 信息監控、類文件處理

JDK提供的JMX(Java Management Extensions Java管理擴展,是一個為應用程序植入管理功能的框架),JMX管理管理了一系列MBean對象,Arthas正是基于這些MBean對象實現內存、GC、類加載信息、JVM信息監控

(2) 方法調用

從JDK5之后,引入了java.lang.Instrument,程序員通過修改方法的字節碼實現動態修改類代碼。在代理類的方法中的參數中,就有Instrumentation inst實例。通過該實例,我們可以調用Instrumentation提供的各種接口。比如調用inst.getAllLoadedClasses()得到所有已經加載過的類。調用inst.addTransformer(new SdlTransformer(), true)新增轉換器。調用inst.retransformClasses(Class cls),向JVM發起重轉換請求

Arthas使用ASM生成增強后的類的字節碼,增強的功能包括方法調用入參、返回值查看、方法調用統計、方法調用記錄和重做,再基于JDK提供的Instrumentation接口對方法進行增加和轉換

5 實戰案例

Arthas官方文檔提供了許多用戶案例,下面介紹幾個比較有意思的案例:

(1) 排查應用奇怪日志來源

案例詳情 服務應用運行中有時會出現一些奇怪日志,排查定位這些日志的來源比較麻煩 通過修改StringBuilder的實現代碼打印出日志的調用堆棧信息,編譯生成StringBuilder.clss,再基于Arthas提供的redefine命令修改應用中使用的StringBuilder的實際使用字節碼

(2) 排查SpringBoot應用401/404問題

案例詳情 頁面訪問返回401/404,碰到這種問題時,通常很頭痛,特別是在線上環境時 通過Arthas提供的trace命令,打印出頁面訪問時的完整請求樹,定位出具體哪個Servlet返回404

$ trace javax.servlet.Servlet *
Press Ctrl+C to abort.
Affect(class-cnt:7 , method-cnt:185) cost in 1018 ms.

通過trace命令,trace對象是javax.servlet.Filter定位具體哪個Filter攔截請求定位返回401的問題來源

$ trace javax.servlet.Filter *
Press Ctrl+C to abort.
Affect(class-cnt:13 , method-cnt:75) cost in 278 ms.

(3) 線上代碼熱更新

案例詳情 有時為了快速驗證線上問題的修復方案,或者為了快速測試,我們需要熱更新代碼 Arthas提供的解決步驟如下

  • 步驟1 jad命令反編譯代碼

  • 步驟2 文本編輯器修改代碼

  • 步驟3 sc命令查找代碼所在類的ClassLoader

  • 步驟4 mc命令指定ClassLoader編譯代碼

  • 步驟5 redefine命令熱更新代碼

“Java中Arthas的作用及使用方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳江市| 海淀区| 白银市| 资阳市| 图木舒克市| 永福县| 太仆寺旗| 响水县| 鄂尔多斯市| 鄂托克旗| 朝阳市| 酉阳| 潢川县| 保定市| 梁平县| 建平县| 时尚| 潜江市| 丰宁| 高淳县| 甘谷县| 屏南县| 南华县| 新乐市| 手游| 九台市| 安达市| 洛宁县| 汕头市| 潜山县| 方山县| 本溪市| 神池县| 临猗县| 白水县| 德昌县| 淮安市| 和田县| 桑植县| 清水河县| 博乐市|