Java軟件生產監(jiān)控工具Btrace使用方法詳解
Btrace
BTrace是sun公司推出的一款Java 動態(tài)、安全追蹤(監(jiān)控)工具,可以在不用重啟的情況下監(jiān)控系統運行情況,方便的獲取程序運行時的數據信息,如方法參數、返回值、全局變量和堆棧信息等,并且做到最少的侵入,占用最少的系統資源。
項目地址:Btrace
用戶指南:UserGuide
Btrace使用
在Release頁面里下載最新Zip版,解壓就能用
tar -zxvf btrace-bin-1.3.8.3.tgz
export JAVA_HOME=/opt/taobao/java
export PATH=$JAVA_HOME/bin:$PATH
./bin/btrace -cp /home/admin/projectname/target/projectname/BOOT-INF/classes 2016 SlowCall.java
./bin/btrace -cp /home/admin/projectname/target/projectname.war/WEB-INF/classes:/home/admin/projectname/target/projectname.war/WEB-INF/lib/projectname-1.0-SNAPSHOT.jar 71419 BtraceTest.java > NT12.txt
由于Btrace會把腳本邏輯直接侵入到運行的代碼中,所以在使用上做很多限制:
1、不能創(chuàng)建對象
2、不能使用數組
3、不能拋出或捕獲異常
4、不能使用循環(huán)
5、不能使用synchronized關鍵字
6、屬性和方法必須使用static修飾
根據官方聲明,不恰當的使用BTrace可能導致JVM崩潰,如在BTrace腳本使用錯誤的class文件,所以在上生產環(huán)境之前,務必在本地充分的驗證腳本的正確性。
Btrace可以做什么?
1、接口性能變慢,分析每個方法的耗時情況;
2、當在Map中插入大量數據,分析其擴容情況;
3、分析哪個方法調用了System.gc(),調用棧如何;
4、執(zhí)行某個方法拋出異常時,分析運行時參數;
5、....
Btrace第一個例子
package com.metty.rpc.common;
import java.util.Random;
public class BtraceCase {
public static Random random = new Random();
public int size;
public static void main(String[] args) throws Exception {
new BtraceCase().run();
}
public void run() throws Exception {
while (true) {
add(random.nextInt(10), random.nextInt(10));
}
}
public int add(int a, int b) throws Exception {
Thread.sleep(random.nextInt(10) * 100);
return a + b;
}
}
執(zhí)行add方法時,對傳入參數、返回值以及執(zhí)行耗時進行分析,btrace腳本:

通過jps命令獲取pid為8454
執(zhí)行btrace 8454 Debug.java實現對運行代碼的監(jiān)控,輸出結果如下:

可以發(fā)現,Btrace可以獲取每次執(zhí)行add方法時的數據,當然Btrace能做的遠遠不止這些,比如獲取當前jvm堆使用情況、當前線程的執(zhí)行棧等等。
參數說明
@OnMethod
Btrace使用@OnMethod注解定義需要分析的方法入口

在@OnMethod注解中,需要指定class、method以及l(fā)ocation等,class表明需要監(jiān)控的類,method表明需要監(jiān)控的方法,指定方式如下:
1、使用全限定名:clazz="com.metty.rpc.common.BtraceCase", method="add"
2、使用正則表達式:clazz="/javax\\.swing\\..*/", method="/.*/"
3、使用接口:clazz="+com.ctrip.demo.Filter", method="doFilter"
4、使用注解:clazz="@javax.jws.WebService", method=""@javax.jws.WebMethod"
5、如果需要分析構造方法,需要指定method="<init>"
@Location
定義Btrace對方法的攔截位置,通過@Location注解指定,默認為Kind.ENTRY
1、Kind.ENTRY:在進入方法時,調用Btrace腳本
2、Kind.RETURN:方法執(zhí)行完時,調用Btrace腳本,只有把攔截位置定義為Kind.RETURN,才能獲取方法的返回結果@Return和執(zhí)行時間@Duration

3、Kind.CALL:分析方法中調用其它方法的執(zhí)行情況,比如在execute方法中,想獲取add方法的執(zhí)行耗時,必須把where設置成Where.AFTER

4、Kind.LINE:通過設置line,可以監(jiān)控代碼是否執(zhí)行到指定的位置

5、Kind.ERROR, Kind.THROW, Kind.CATCH
用于對某些異常情況的跟蹤,包括異常拋出,異常被捕獲,異常未捕獲被拋出方法之外
如何使用Btrace定位問題
1、找出所有耗時超過1ms的過濾器Filter

由于@Dutation返回的時間是納秒級別,需要進行轉換,如果定位一個Filter性能變慢,接著使用@Location(Kind.CALL)進行更細粒度的分析。
2、分析哪個方法調用了System.gc(),調用棧如何?

通過查看調用棧,可以很清楚的發(fā)現哪個類哪個方法調用了System.gc()
3、統計方法的調用次數,且每隔1分鐘打印調用次數

Btrace的@OnTimer注解可以實現定時執(zhí)行腳本中的一個方法
4、方法執(zhí)行時,查看對象的實例屬性值

通過反射機制,可以很方法的得到當前實例的屬性值
總結
Btrace能做的事情太多,但使用之前切記檢查腳本的可行性,一旦Btrace腳本侵入到系統中,只有通過重啟才能恢復。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
基于SpringMVC攔截器實現接口耗時監(jiān)控功能
本文呢主要介紹了基于SpringMVC攔截器實現的接口耗時監(jiān)控功能,統計接口的耗時情況屬于一個可以復用的功能點,因此這里直接使用 SpringMVC的HandlerInterceptor攔截器來實現,需要的朋友可以參考下2024-02-02
GraalVM系列Native?Image?Basics靜態(tài)分析
這篇文章主要為大家介紹了GraalVM系列Native?Image?Basics靜態(tài)分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
關于任務調度框架quartz使用(異常處理,解決恢復后多次調度處理)
這篇文章主要介紹了關于任務調度框架quartz使用(異常處理,解決恢復后多次調度處理),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12

