Java調優—Btrace監控Java執行緒/方法執行引數、執行時間(Windows)

執筆記憶的空白發表於2017-03-08

Windows環境下jvisualvm+Btrace 監控Java程式

一、背景

在專案開發中,想要監控程式,我們可以本地啟動專案,然後斷點除錯,可是對於線上的專案需要監控或者除錯的時候,就沒什麼辦法,目前有以下幾種監控方式:

1、通過日誌監控。通過程式碼中寫的日誌記錄,來跟蹤程式的執行,但是無法監控程式執行時間

2、通過JConsole跟蹤和監控程式:參考

3、利用jstack分析執行緒

4、通過Btrace來跟蹤和監控程式

今天我們要說的,就是第三種,利用Btrace來監控Java程式的執行


二、安裝與執行(Windows)

在windows環境下,可以直接利用jdk自帶的jvisualvm工具來 安裝Btrace外掛,具體操作如下:
1、進入jdk安裝目錄,進入bin目錄,找到jvisualvm.exe ,開啟之後,在工具欄——>工具——>外掛   ,搜尋外掛BTrace Workbench,然後安裝


2、啟動你程式所在的Tomcat,在jvisualvm.exe 視窗你會發現有個Tomcat的選單圖示,右鍵——>選擇Trace application,具體如下圖:



3、如果想監控程式執行時間,複製如下程式碼到Btrace窗體內:
package my.app.btrace;
import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;
@BTrace 
public class TraceProductManageImpl { 

@OnMethod(clazz = "/com.odianyun.+business.+/", method = "/.+/", location = @Location(Kind.RETURN)) 
public static void traceExecute(@ProbeClassName String name,@ProbeMethodName String method,@Duration long time){ 
long durationTime = time/1000000;
if(durationTime > 0){
String output = strcat(name,".");
output = strcat(output,method);
output = strcat(output,"#");
output = strcat(output,str(probeLine()));
output = strcat(output,">>");
output = strcat(output,str(durationTime));
output = strcat(output,">>ThreadId:");
output = strcat(output,str(threadId(currentThread())));
println(output);
}
} 
}




具體操作如下圖:


然後你就能監控你程式方法的執行時間(這裡監控的是你填寫package目錄下的每個class下面 的方法)



三、Linux下安裝Btrace

1、目前最新版下載地址是:點選開啟連結

2、選擇不同版本下載
3、Linux安裝,需要設定BTRACE_HOME環境變數和在PATH中新增bin目錄,並新增bin目錄下檔案的可執行許可權。
4、把上述程式碼,寫到一個檔案,例如:DEMO.java 是用java寫的指令碼,上傳到伺服器上即可執行。  btrace 4552 DEMO.java >> /data/btrace/DEMO.txt



四、補充

如果想監控程式的引數什麼的,換成以下程式碼即可:
ackage my.app.btrace;
import static com.sun.btrace.BTraceUtils.println;
import static com.sun.btrace.BTraceUtils.size;
import static com.sun.btrace.BTraceUtils.str;
import static com.sun.btrace.BTraceUtils.strcat;
import java.util.List;
import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.ProbeClassName;
import com.sun.btrace.annotations.ProbeMethodName;
import com.sun.btrace.annotations.Return;
import com.sun.btrace.annotations.Self;
@BTrace
/**
* 獲取程式引數
* @author Michael
*/
public class TraceProductManageParam { 

@OnMethod(clazz = "com.odianyun.frontier.guide.business.read.manage.impl.PromotionManageImpl", method = "getMerchantProductCurrentPromotionPriceBatch", location = @Location(Kind.RETURN)) 
public static void traceExecute(@ProbeClassName String name,@ProbeMethodName String method,@Self Object self, List<Long> mpIds, Long companyId, @Return List<?> ret){ 
String output = strcat(name,".");
output = strcat(output,method);
output = strcat(output,">inputItems:");
output = strcat(output, str(mpIds));
output = strcat(output,">outputSize:");
output = strcat(output, str(size(ret)));
println(output);
} 
}




相關文章