溫馨提示×

溫馨提示×

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

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

Java中怎么利用BTrace實現(xiàn)問題診斷

發(fā)布時間:2021-07-01 15:12:48 來源:億速云 閱讀:181 作者:Leah 欄目:大數(shù)據(jù)

這篇文章給大家介紹Java中怎么利用BTrace實現(xiàn)問題診斷,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

BTrace是什么

BTrace is a safe, dynamic tracing tool for the Java platform. BTrace can be used to dynamically trace a running Java program (similar to DTrace for OpenSolaris applications and OS). BTrace dynamically instruments the classes of the target application to inject tracing code (“bytecode tracing”). Tracing code is expressed in Java programming language. There is also integration with DTrace for the OpenSolaris platform. admins were sundararajana and Jaroslov Bachorik

概括起來 BTrace 是一個動態(tài)的問題分析和診斷工具,類似于Solaris上的DTrace,基于JDK 提供的 Instrument特性,在JVM 運行過程中進行類的 retransform ,從而使定義的Trace script 生效。

比如分析如下的系統(tǒng)問題:

  • 應用中有大量的Socket連接,導致運行過程中會產(chǎn)生Socket句柄占用過多,系統(tǒng)異常??梢灾苯臃治鰬么a中打開和關(guān)閉Socket的地方,統(tǒng)計次數(shù)。類似可以應用于數(shù)據(jù)庫連接等。

  • 應用的GC日志顯示有頻繁的 System.gc()的調(diào)用??梢灾苯臃治稣{(diào)用方,打印調(diào)用Stack。

  • 線上應用統(tǒng)計某個方法的調(diào)用時間

  • 線上應用查看方法調(diào)用的返回值

更多可以參考UserGuide,或者參考下載包中包含的sample

基本原理

在BTrace中有探針(Probe)的一個概念,所有定義的OnMethod都可以看成一個探針,和現(xiàn)在APM工具里的概念類似,在特定的節(jié)點進行觸發(fā)。臨時新增的Trace 腳本,通過JVM TI 提供和Instrument動態(tài)增加到目標class中。相當于新增了一個trace方法,然后在源方法中進行trace方法的調(diào)用。

我們前面的文章曾經(jīng)寫過關(guān)于 class 的 HotSwap 實現(xiàn),當時里面的幾個圖都是分析的 BTrace 對于目標 class 增加了探針之后的具體表現(xiàn)形式。(類加載器與類的熱替換(Hotswap)

而整體的 Instrument 也是通過 JVMTI來實現(xiàn)類的 Retransform,這個在前面分析Debug的實現(xiàn)原理時也曾寫過:當我們談Debug時,我們在談什么(Debug實現(xiàn)原理)

使用

具體到BTrace的使用,其實非常容易,我們介紹常用的兩種方式:

1. 下載  https://github.com/btraceio/btrace/releases,在這里下載,然后編寫 Trace 腳本,在命令行中執(zhí)行 btrace PID script.java 即可。

2. 直接在 JvisualVM 中添加 BTrace 插件, 然后分析對應的應用時,直接右擊進程,選擇 Trace application,即可打開一個類似于 IDE 的窗口,在其中編寫 Trace 腳本,執(zhí)行 start即可。

Trace 腳本的編寫也比較容易,在任意的方法中通過 OnMethod 聲明探針,BTrace 中稱之為 Probe,然后指定要 trace 的class 名稱 和方法名稱, 在方法體中直接編寫對應的Probe被觸發(fā)時要執(zhí)行的邏輯。  更詳細的內(nèi)容可以參考下 UserGuide 或者附帶的幾個 sample。

比較而言,第二種使用更方便,但缺點是不支持遠程 Trace。

例子

比如觀察發(fā)現(xiàn)應用中有些時候會執(zhí)行 System.gc()。 為了排查是否是在應用中直接調(diào)用,就可以通過 BTrace

Java中怎么利用BTrace實現(xiàn)問題診斷

對于數(shù)據(jù)庫連接的獲取等,可以直接判斷其 getConnection 的調(diào)用

Java中怎么利用BTrace實現(xiàn)問題診斷

自己懶的寫了,這幾個是在gist 上找了幾個截的圖,方法了解其語法以及一些常用的用法。其中對于一些對象的構(gòu)造方法調(diào)用等,可以直接指定方法為 <init>

甚至對于一個方法的執(zhí)行時間,對于代碼編寫時沒有添加Log時也不需要再增加,可以直接通過腳本進行,在方法退出時打印消耗時間:

Java中怎么利用BTrace實現(xiàn)問題診斷

此外,對于方法體內(nèi)傳入的參數(shù),調(diào)用鏈的打印等都可以方便的進行。

也可以獲取一個類的屬性值,以及類內(nèi)某個方法對于另外指定方法的調(diào)用。

而對于以上這些操作,最關(guān)鍵的是不需要停止應用,可以動態(tài)的進行修改,從而實現(xiàn)應用的分析診斷。

當然,對于執(zhí)行完 Trace腳本后,這些內(nèi)容會仍然保留在已加載的 class 內(nèi),直到應用重啟或者 class 再次 transform。

關(guān)于Java中怎么利用BTrace實現(xiàn)問題診斷就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

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

AI