Btrace的使用方法
本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》
写在前面:
Btrace有很多用法,比如说性能监视,连接泄露,内存泄漏,多线程竞争,而本文说的只是最基本的应用打印调用堆栈,参数和返回值
Btrace简介
Btrace是一个VisualVM插件,作用是在不停止目标程序的前提下,通过HotSpot的HotSwap技术动态加入原本并不存在的调试代码,这个在实际生产中很有意义。
Btrace安装
打开VisualVM,然后选择工具->插件->可用插件->Btrace,然后安装即可
Btrace跟踪
在VisualVM中,选中应用程序->右键->trace application然后就出现了下面的像java编辑器的代码
现在用一个测试程序来测试一下:
1,新建一个BtraceTest类
package com.lyy; import java.io.BufferedReader; import java.io.InputStreamReader; public class BtraceTest { public int add(int a,int b){ return a+b; } public static void main(String[] ages)throws Exception{ BtraceTest btraceTEst = new BtraceTest(); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); for(int i=0;i<10;i++){ reader.readLine(); int a = (int)Math.round(Math.random()*1000); int b = (int)Math.round(Math.random()*1000); System.out.println(btraceTEst.add(a,b)); } } }
2,启动这个应用程序,程序处于阻塞状态,等待用户输入
3,打开VisualVM,找到对应的应用程序,右键->trace application
4,在Btrace中添加要追踪的方法,点击start
/* BTrace Script Template */ import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; @BTrace public class TracingScript { @OnMethod ( clazz = "com.lyy.BtraceTest", method = "add", location = @Location( Kind.RETURN ) ) public static void func(@Self com.lyy.BtraceTEst instance, int a, int b,@Return int result){ println("调用堆栈:"); jstack(); println(strcat("方法参数A:",str(a))); println(strcat("方法参数B:",str(b))); println(strcat("方法结果:",str(result))); } }
5,在应用程序中调用追踪的方法,然后切换到VisualVM中,看看监听的值