Btrace

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值