您好,登錄后才能下訂單哦!
這篇文章給大家介紹Java中怎么利用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 是一個動態的問題分析和診斷工具,類似于Solaris上的DTrace,基于JDK 提供的 Instrument特性,在JVM 運行過程中進行類的 retransform ,從而使定義的Trace script
生效。
比如分析如下的系統問題:
應用中有大量的Socket連接,導致運行過程中會產生Socket句柄占用過多,系統異常。可以直接分析應用代碼中打開和關閉Socket的地方,統計次數。類似可以應用于數據庫連接等。
應用的GC日志顯示有頻繁的 System.gc()
的調用。可以直接分析調用方,打印調用Stack。
線上應用統計某個方法的調用時間
線上應用查看方法調用的返回值
…
更多可以參考UserGuide,或者參考下載包中包含的sample
在BTrace中有探針(Probe)的一個概念,所有定義的OnMethod都可以看成一個探針,和現在APM工具里的概念類似,在特定的節點進行觸發。臨時新增的Trace 腳本,通過JVM TI 提供和Instrument動態增加到目標class中。相當于新增了一個trace方法,然后在源方法中進行trace方法的調用。
我們前面的文章曾經寫過關于 class 的 HotSwap 實現,當時里面的幾個圖都是分析的 BTrace 對于目標 class 增加了探針之后的具體表現形式。(類加載器與類的熱替換(Hotswap)
而整體的 Instrument 也是通過 JVMTI來實現類的 Retransform,這個在前面分析Debug的實現原理時也曾寫過:當我們談Debug時,我們在談什么(Debug實現原理)
使用
具體到BTrace的使用,其實非常容易,我們介紹常用的兩種方式:
1. 下載 https://github.com/btraceio/btrace/releases,在這里下載,然后編寫 Trace 腳本,在命令行中執行 btrace PID script.java 即可。
2. 直接在 JvisualVM 中添加 BTrace 插件, 然后分析對應的應用時,直接右擊進程,選擇 Trace application,即可打開一個類似于 IDE 的窗口,在其中編寫 Trace 腳本,執行 start即可。
Trace 腳本的編寫也比較容易,在任意的方法中通過 OnMethod 聲明探針,BTrace 中稱之為 Probe,然后指定要 trace 的class 名稱 和方法名稱, 在方法體中直接編寫對應的Probe被觸發時要執行的邏輯。 更詳細的內容可以參考下 UserGuide 或者附帶的幾個 sample。
比較而言,第二種使用更方便,但缺點是不支持遠程 Trace。
例子
比如觀察發現應用中有些時候會執行 System.gc()。 為了排查是否是在應用中直接調用,就可以通過 BTrace
對于數據庫連接的獲取等,可以直接判斷其 getConnection 的調用
自己懶的寫了,這幾個是在gist 上找了幾個截的圖,方法了解其語法以及一些常用的用法。其中對于一些對象的構造方法調用等,可以直接指定方法為 <init>
甚至對于一個方法的執行時間,對于代碼編寫時沒有添加Log時也不需要再增加,可以直接通過腳本進行,在方法退出時打印消耗時間:
此外,對于方法體內傳入的參數,調用鏈的打印等都可以方便的進行。
也可以獲取一個類的屬性值,以及類內某個方法對于另外指定方法的調用。
而對于以上這些操作,最關鍵的是不需要停止應用,可以動態的進行修改,從而實現應用的分析診斷。
當然,對于執行完 Trace腳本后,這些內容會仍然保留在已加載的 class 內,直到應用重啟或者 class 再次 transform。
關于Java中怎么利用BTrace實現問題診斷就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。