BTrace:Java开发人员工具箱中的隐藏宝石
不久,該工具允許注入跟蹤點,而無需在運(yùn)行時重新啟動或重新配置Java應(yīng)用程序。 而且,盡管有多種方法可以做到這一點,但我今天要討論的方法是使用標(biāo)準(zhǔn)JDK捆綁包中的JVisualVM工具。
太酷了, BTrace本身使用Java語言定義注入跟蹤點。 如果您曾經(jīng)進(jìn)行過面向方面的編程(AOP),則該方法看起來非常熟悉。
因此,讓我們開始一個問題:我們有一個使用NoSQL數(shù)據(jù)庫之一(例如,讓它成為MongoDB)的應(yīng)用程序,突然開始出現(xiàn)明顯的性能下降。 開發(fā)人員懷疑應(yīng)用程序運(yùn)行過多的查詢或更新,但不能自信地說。 BTrace在這里可以提供幫助。
首先,讓我們運(yùn)行JVisualVM并安裝BTrace插件:
JVisualVM應(yīng)該重新啟動以使插件出現(xiàn)。 現(xiàn)在,當(dāng)我們的應(yīng)用程序啟動并運(yùn)行時,讓我們在JVisualVM應(yīng)用程序樹中右鍵單擊它:
將出現(xiàn)以下非常直觀的BTrace編輯器(帶有簡單的工具欄):
在這里可以定義跟蹤工具并將其動態(tài)注入正在運(yùn)行的應(yīng)用程序中。 BTrace有一個非常豐富的模型來定義應(yīng)該精確跟蹤的內(nèi)容:方法,構(gòu)造函數(shù),方法返回,錯誤等。 它還支持開箱即用的聚合,因此在應(yīng)用程序運(yùn)行時很容易收集大量指標(biāo)。 對于我們的問題,我們想查看與MongoDB相關(guān)的哪些方法正在執(zhí)行。
當(dāng)我的應(yīng)用程序使用Spring Data MongoDB時 ,我對應(yīng)用程序正在調(diào)用org.springframework.data.mongodb.core.MongoOperations接口的任何實現(xiàn)的方法以及每次調(diào)用需要多長時間感興趣。 所以我定義了一個非常簡單的BTrace腳本:
import com.sun.btrace.*; import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*;@BTrace public class TracingScript {@TLS private static String method;@OnMethod(clazz = '+org.springframework.data.mongodb.core.MongoOperations', method = '/.*/')public static void onMongo( @ProbeClassName String className, @ProbeMethodName String probeMethod, AnyType[] args ) {method = strcat( strcat( className, '::' ), probeMethod );}@OnMethod(clazz = '+org.springframework.data.mongodb.core.MongoOperations', method = '/.*/', location = @Location( Kind.RETURN ) )public static void onMongoReturn( @Duration long duration ) {println( strcat( strcat( strcat( strcat( 'Method ', method ), ' executed in ' ), str( duration / 1000 ) ), 'ms' ) );} }讓我簡要解釋一下我在做什么。 基本上,我想知道何時調(diào)用org.springframework.data.mongodb.core.MongoOperations的任何實現(xiàn)的任何方法( onMongo標(biāo)記)和調(diào)用持續(xù)時間( onMongoReturn依次標(biāo)記)。 線程局部變量方法保存完整的合格方法名稱(帶有類),而由于使用了有用的BTrace預(yù)定義注釋, duration參數(shù)保存了方法執(zhí)行時間(以納秒為單位)。 盡管它是純Java,但BTrace僅允許使用Java類的一小部分。 這不是問題,因為com.sun.btrace.BTraceUtils類提供了許多有用的方法(fe, strcat )來填補(bǔ)空白。 運(yùn)行此腳本將產(chǎn)生以下輸出:
** Compiling the BTrace script ... *** Compiled ** Instrumenting 1 classes ... Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 25ms Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 3ms Method org.springframework.data.mongodb.core.MongoTemplate::getDb executed in 22ms Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 2ms Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 19ms Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 2ms Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 1ms Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 3ms Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 2ms Method org.springframework.data.mongodb.core.MongoTemplate::getDb executed in 2ms Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 1ms Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 6ms Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 1ms Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 0ms Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 2ms Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 1ms Method org.springframework.data.mongodb.core.MongoTemplate::getDb executed in 2ms Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 1ms Method org.springframework.data.mongodb.core.MongoTemplate::prepareCollection executed in 6ms Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 1ms Method org.springframework.data.mongodb.core.MongoTemplate::access$100 executed in 0ms Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 2ms Method org.springframework.data.mongodb.core.MongoTemplate::maybeEmitEvent executed in 1ms ...如您所見,輸出包含一堆內(nèi)部類,可以通過提供更精確的方法名稱模板(或者甚至可以跟蹤MongoDB驅(qū)動程序)來消除它們。
我才剛剛開始發(fā)現(xiàn)BTrace,但是使用該功能強(qiáng)大的工具對開發(fā)人員來說, 無疑是很有價值的。
參考: BTrace:我們的JCG合作伙伴 Andrey Redko在Andriy Redko {devmind}博客上的Java開發(fā)人員工具箱中的隱藏寶石 。
翻譯自: https://www.javacodegeeks.com/2012/08/btrace-hidden-gem-in-java-developer.html
總結(jié)
以上是生活随笔為你收集整理的BTrace:Java开发人员工具箱中的隐藏宝石的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux c编译(c linux
- 下一篇: 集成JavaFX和Swing