日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

BTrace:Java开发人员工具箱中的隐藏宝石

發(fā)布時間:2023/12/3 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BTrace:Java开发人员工具箱中的隐藏宝石 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這篇文章是關于BTrace的 ,我正在考慮將其作為Java開發(fā)人員的隱藏寶藏。 BTrace是用于Java平臺的安全,動態(tài)跟蹤工具。 BTrace可用于動態(tài)跟蹤正在運行的Java程序(類似于DTrace,適用于OpenSolaris應用程序和OS)。

不久,該工具允許注入跟蹤點,而無需在運行時重新啟動或重新配置Java應用程序。 而且,盡管有多種方法可以做到這一點,但我今天要討論的方法是使用標準JDK捆綁包中的JVisualVM工具。

太酷了, BTrace本身使用Java語言定義注入跟蹤點。 如果您曾經(jīng)進行過面向方面的編程(AOP),則該方法看起來非常熟悉。

因此,讓我們開始一個問題:我們有一個使用NoSQL數(shù)據(jù)庫之一(例如,讓它成為MongoDB)的應用程序,突然開始出現(xiàn)明顯的性能下降。 開發(fā)人員懷疑應用程序運行過多的查詢或更新,但不能自信地說。 BTrace在這里可以提供幫助。

首先,讓我們運行JVisualVM并安裝BTrace插件:

JVisualVM應該重新啟動以使插件出現(xiàn)。 現(xiàn)在,當我們的應用程序啟動并運行時,讓我們在JVisualVM應用程序樹中右鍵單擊它:

將出現(xiàn)以下非常直觀的BTrace編輯器(帶有簡單的工具欄):

在這里可以定義跟蹤工具并將其動態(tài)注入正在運行的應用程序中。 BTrace有一個非常豐富的模型來定義應該精確跟蹤的內(nèi)容:方法,構造函數(shù),方法返回,錯誤等。 它還支持開箱即用的聚合,因此在應用程序運行時很容易收集大量指標。 對于我們的問題,我們想查看與MongoDB相關的哪些方法正在執(zhí)行。

當我的應用程序使用Spring Data MongoDB時 ,我對應用程序正在調(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標記)和調(diào)用持續(xù)時間( onMongoReturn依次標記)。 線程局部變量方法保存完整的合格方法名稱(帶有類),而由于使用了有用的BTrace預定義注釋, duration參數(shù)保存了方法執(zhí)行時間(以納秒為單位)。 盡管它是純Java,但BTrace僅允許使用Java類的一小部分。 這不是問題,因為com.sun.btrace.BTraceUtils類提供了許多有用的方法(fe, strcat )來填補空白。 運行此腳本將產(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,但是使用該功能強大的工具對開發(fā)人員來說, 無疑是很有價值的。

參考: BTrace:我們的JCG合作伙伴 Andrey Redko在Andriy Redko {devmind}博客上的Java開發(fā)人員工具箱中的隱藏寶石 。


翻譯自: https://www.javacodegeeks.com/2012/08/btrace-hidden-gem-in-java-developer.html

總結

以上是生活随笔為你收集整理的BTrace:Java开发人员工具箱中的隐藏宝石的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。