Btrace
在VisualVM中使用BTrace· VisualVM介绍VisualVM 提供在 Java虚拟机 (Java Virutal Machine, JVM)上运行的 Java应用程序的详细信息。在VisualVM的图形用户界面中,可以方便、快捷地查看多个 Java应用程序的相关信息· BTrace介绍BTrace是一个Java的动态跟踪工具,B
在VisualVM中使用BTrace
· VisualVM介绍
VisualVM 提供在 Java 虚拟机 (Java Virutal Machine, JVM)上运行的 Java应用程序的详细信息。在 VisualVM的图形用户界面中,可以方便、快捷地查看多个 Java应用程序的相关信息
· BTrace介绍
BTrace是一个Java的动态跟踪工具,BTrace的工作的基本原理是把跟踪的代码动态替换到被跟踪的Java程序内,其实现机制是Sun Attach API +BTrace脚本解析引擎 +Objectweb ASM + JDK6 Instumentation,下载地址 http://kenai.com/projects/btrace/downloads/directory/releases/.
· 在VisualVM中安装BTrace插件
可以在VisualVM的“工具》插件”里面的可用插件里面找到BTrace或者在已下载里面将从BTrace官网下载的VisualVM插件添加进来,安装完成后重启VisualVM并在左侧的VisualVM点击右键TraceApplication
强烈建议在VisualVM中编写和测试BTrace脚本,启动、关闭、发送事件、增加classpath都非常方便。
· BTrace实战
下面的代码定义了一个测试类,用scriptEngine计算一个表达式的值
package
com.zld.btrace.test;
import
javax.script.ScriptEngine;
import
javax.script.ScriptEngineManager;
public
class
ScriptEngineTest {
public static void main(String args[]) throws Exception {
ScriptEngineTest test=new ScriptEngineTest();
while(true){
test.count();
Thread.sleep(
1000
);
}
}
public void count() throws Exception{
ScriptEngineManager scriptEngineMgr = new ScriptEngineManager();
ScriptEngine engine = scriptEngineMgr.getEngineByName(
"JavaScript"
);
engine.put(
"a"
,
20
);
engine.put(
"b"
,
1000
);
engine.put(
"c"
,
500
);
String jsExpression =
"return a+b+c;"
;
Object result = engine.eval(
"(function(){ "
+ jsExpression +
"})()"
);
System.out.println(result.toString());
}
}
下面通过Btrace脚本去监控里面的方法的执行时间
/* BTrace Script Template */
import
com.sun.btrace.annotations.*;
import
static com.sun.btrace.BTraceUtils.*;
@BTrace
public
class
TracingScript {
@TLS private static long startTime =
0
;
@OnMethod(clazz=
"javax.script.ScriptEngineManager"
,method=
"getEngineByName"
,location=@Location(Kind.RETURN))
public static void onCall(){
println(
"enter this method"
);
startTime=timeMillis();
}
@OnMethod(clazz=
"javax.script.ScriptEngineManager"
,method=
"getEngineByName"
,location=@Location(Kind.RETURN))
public static void onReturn(){
println(
"method end!"
);
println(strcat(
"Time taken ms"
,str(timeMillis()-startTime)));
}
}
· 方法注解说明
1. @OnMethod:指定使用当前注解的方法应该在什么情况下触发,claszz属性指定要匹配的类的全限定类名,可以用正则表达式:/类名的Pattern/匹配,用”+类名”匹配所有子类,用”@某某注解”匹配用该注解注解过的类method属性指定要匹配的方法名称,可以用正则表达式:/方法名称的Pattern/匹配type属性:void(java.lang.String)可以用于匹配:publicvoid funcName(String param) throws Exception,location属性用@Location来表明,匹配了clazz,method情况,在方法执行的何时去执行脚本(前,后,异常,行,某个方法调用)
2. @OnTimer:指定一个定时任务
3. @OnExit:当脚本运行Sys.exit(code)时触发
4. @OnError:当脚本运行抛出异常时触发
5. @OnEvent:脚本运行时Ctrl+C可以发送事件
6. @OnLowMemory:让你指定一个阀值,内存低于阀值触发
7. @OnProbe:可以用一个xml文件来描述你想在什么时候触发该方法
· 方法参数注解说明
1. @Self:目标对象本身
2. @Retrun:目标程序方法返回值(Kind.RETURN)
3. @ProbeClassName:目标类名
4. @ProbeMethodName:目标方法名
5. @targetInstance:@Location指定的clazz,method的目标(Kind.CALL)
6. @targetMethodOrField:@Location指定的clazz,method的目标的方法或字段(Kind.CALL)
7. @Duration:目标方法执行时间,单位是纳秒,需要与 Kind.RETURN 或者 Kind.ERROR一起使用
监控一个方法的执行时间从而知道比较耗时的方法进行方法调优是一种比较常见的使用,这里我没有举太多例子,因为每人用BTrace的目的不一样,况且官方文档中已经有太多的例子说明,而使用方式已经在这里列出,所以就不再一一展开。
具体的使用大伙可以本地实践下,最后推荐一个工具,马克飞象http://maxiang.info/,用于在印象笔记中编写Markdown
更多推荐
所有评论(0)