非常强烈的推荐下BTrace这个工具,用了后不得不说太强大了,BTrace简单来说,就是能在不改动当前程序的情况下,运行时的去监控Java程序的执行状况,例如可以做到内存状况的监控、方法调用的监控等等,官方网站上有非常多详细的例子,我不说太多,只在下面举一个简单的例子来说明它的作用,BTrace的User Guide请见:
http://kenai.com/projects/btrace/pages/UserGuide
。
对于运行中的Java程序,尤其是出了问题的程序,会需要跟踪其执行状况,例如传入的参数是什么、执行了多少时间,返回的对象是什么,抛出了什么异常,传统的做法只能是把程序改一遍,加上一堆log,一个例子来展示下用BTrace的情况下,怎么来跟踪一个方法的执行时间:
用btrace执行上面的代码,就可以动态的监控任意的目前运行的Java程序中某类的某方法的执行时间,执行上面代码的方式如下(jdk 6+):
btrace [pid] MethodResponseTime.class
还有例如获取调用参数、调用者的对象实例以及返回值等请参看User Guide。
btrace为了保持JVM运行的安全性,因此做了很多的限制,例如不能抛出异常、修改传入的参数的值、修改返回值等,基本是一个只读的动态分析代码运行状况的工具,但仍然是非常的有用,其实现机制是attach api + asm + instrumentation。
对于运行中的Java程序,尤其是出了问题的程序,会需要跟踪其执行状况,例如传入的参数是什么、执行了多少时间,返回的对象是什么,抛出了什么异常,传统的做法只能是把程序改一遍,加上一堆log,一个例子来展示下用BTrace的情况下,怎么来跟踪一个方法的执行时间:
@BTrace
public
class
MethodResponseTime {
@TLS private static long startTime;
@OnMethod(clazz = "类名 " ,method = "方法名 " )
public static void onCall(){
println( " enter this method " );
startTime = timeMillis();
}
@OnMethod(clazz = " 类名 " ,method = " 方法名 " ,location = @Location(Kind.RETURN))
public static void onReturn(){
println( " method end! " );
println(strcat( " Time taken ms " ,str(timeMillis() - startTime)));
}
}
@TLS private static long startTime;
@OnMethod(clazz = "类名 " ,method = "方法名 " )
public static void onCall(){
println( " enter this method " );
startTime = timeMillis();
}
@OnMethod(clazz = " 类名 " ,method = " 方法名 " ,location = @Location(Kind.RETURN))
public static void onReturn(){
println( " method end! " );
println(strcat( " Time taken ms " ,str(timeMillis() - startTime)));
}
}
用btrace执行上面的代码,就可以动态的监控任意的目前运行的Java程序中某类的某方法的执行时间,执行上面代码的方式如下(jdk 6+):
btrace [pid] MethodResponseTime.class
还有例如获取调用参数、调用者的对象实例以及返回值等请参看User Guide。
btrace为了保持JVM运行的安全性,因此做了很多的限制,例如不能抛出异常、修改传入的参数的值、修改返回值等,基本是一个只读的动态分析代码运行状况的工具,但仍然是非常的有用,其实现机制是attach api + asm + instrumentation。