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中,看看监听的值

 

posted @ 2017-05-15 15:49  凝荷  阅读(338)  评论(0编辑  收藏  举报