`
jarit
  • 浏览: 142334 次
社区版块
存档分类
最新评论

转 BTrace入门及使用实例

阅读更多

 

介绍
Btrace (Byte Trace)是sun推出的一款java 动态、安全追踪(监控)工具,可以不停机的情况下监控线上情况,并且做到最少的侵入,占用最少的系统资源。
In a way, BTrace scripts are very similar to AOP's aspects, but can be attached to any existing Java code (or better, bytecode) at runtime and without any configuration or modification at development time.

 

运行环境搭建
Steps to run BTrace
1.下载[btrace|http://kenai.com/projects/btrace/downloads/directory/releases]包 并把btrace的命令放到path中
2. jps命令查出需要监控的jvm pid
3. 编写BTrace程序 (安装包中带有大量的例子)
4. Run btrace tool by the following command line:
       btrace <pid> <btrace-script>


BTrace能作的事情

记录以下事件:
    * method calls;
    * execution times;
    * constructor invocation;
    * available memory;

触发脚本执行的场景:
Script execution is tied to several situations
    * reaching a specific line number;
    * invoking a given method;
    * returning from a method;
    * invoking system calls (e.g. exit);
    * recurring timer (period execution at fixed intervals);

 

BTrace不能作的事情
保证BTrace追踪的是只读操作,所以有一堆限制:
不仅强制要求java脚本需要提供public static方法.而且,脚本里无法实例化对象,数组,不能抛异常或捕捉,不能有循环,内部类等。
特别是不能调用任何的实例、静态方法,除了com.sun.btrace.BTraceUtils类static methods。*所以BTrace的功能全部在BTraceUtils中的方法。*


To guarantee that the tracing actions are "read-only" (i.e., the trace actions don't change the state of the program traced) and bounded (i.e., trace actions terminate in bounded time), a BTrace program is allowed to do only a restricted set of actions. In particular, a BTrace class

    * can not create new objects.
    * can not create new arrays.
    * can not throw exceptions.
    * can not catch exceptions.
    * can not make arbitrary instance or static method calls - only the public static methods of com.sun.btrace.BTraceUtils class may be called from a BTrace program.
    * can not assign to static or instance fields of target program's classes and objects. But, BTrace class can assign to it's own static fields ("trace state" can be mutated).
    * can not have instance fields and methods. Only static public void returning methods are allowed for a BTrace class. And all fields have to be static.
    * can not have outer, inner, nested or local classes.
    * can not have synchronized blocks or synchronized methods.
    * can not have loops (for, while, do..while)
    * can not extend arbitrary class (super class has to be java.lang.Object)
    * can not implement interfaces.
    * can not contains assert statements.
    * can not use class literals.

例子
监控某个方法的执行时间

 

 

 

监控所有HTTP request请求的执行时间

 

Java代码 复制代码 收藏代码
  1. @TLS  
  2. private static String invoke = "";   
  3.   
  4. @OnMethod(clazz = "javax.servlet.http.HttpServlet", method = "service", type = "void service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)")   
  5. public static void start(@ProbeClassName String probeClass, @ProbeMethodName String probeMethod) {   
  6.     invoke = concat(str(threadId(currentThread())), strcat("_", str(timeMillis())));   
  7.     print(invoke);   
  8.     print(" ");   
  9.     print(probeClass);   
  10.     print(" ");   
  11.     print(probeMethod);   
  12.     print(" s ");   
  13.     println(timeMillis());   
  14. }   
  15.   
  16. @OnMethod(clazz = "javax.servlet.http.HttpServlet", method = "service", type = "void service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)", location = @Location(Kind.RETURN))   
  17. public static void end(@ProbeClassName String probeClass, @ProbeMethodName String probeMethod) {   
  18.     print(invoke);   
  19.     print(" ");   
  20.     print(probeClass);   
  21.     print(" ");   
  22.     print(probeMethod);   
  23.     print(" e ");   
  24.     println(timeMillis());   
  25.     invoke = "";   
  26. }  
    @TLS
    private static String invoke = "";

    @OnMethod(clazz = "javax.servlet.http.HttpServlet", method = "service", type = "void service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)")
    public static void start(@ProbeClassName String probeClass, @ProbeMethodName String probeMethod) {
        invoke = concat(str(threadId(currentThread())), strcat("_", str(timeMillis())));
        print(invoke);
        print(" ");
        print(probeClass);
        print(" ");
        print(probeMethod);
        print(" s ");
        println(timeMillis());
    }

    @OnMethod(clazz = "javax.servlet.http.HttpServlet", method = "service", type = "void service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)", location = @Location(Kind.RETURN))
    public static void end(@ProbeClassName String probeClass, @ProbeMethodName String probeMethod) {
        print(invoke);
        print(" ");
        print(probeClass);
        print(" ");
        print(probeMethod);
        print(" e ");
        println(timeMillis());
        invoke = "";
    }

 

 

 监控所有HTTP request请求的具体java调用栈 call stack以及执行时间

在上面监控http request的基础上,增加你关心类的方法。然后通过ID(Thread ID, 时间戳)生成对应的调用图。

Java代码 复制代码 收藏代码
  1. import static com.sun.btrace.BTraceUtils.name;   
  2. import static com.sun.btrace.BTraceUtils.print;   
  3. import static com.sun.btrace.BTraceUtils.println;   
  4. import static com.sun.btrace.BTraceUtils.probeClass;   
  5. import static com.sun.btrace.BTraceUtils.probeMethod;   
  6. import static com.sun.btrace.BTraceUtils.str;   
  7. import static com.sun.btrace.BTraceUtils.strcat;   
  8. import static com.sun.btrace.BTraceUtils.timeMillis;   
  9.   
  10. import com.sun.btrace.annotations.BTrace;   
  11. import com.sun.btrace.annotations.Kind;   
  12. import com.sun.btrace.annotations.Location;   
  13. import com.sun.btrace.annotations.OnMethod;   
  14. import com.sun.btrace.annotations.TLS;   
  15.   
  16. /**  
  17.  * 监控方法耗时  
  18.  *   
  19.   */  
  20. @BTrace  
  21. public class PrintTimes {   
  22.   
  23.     /**  
  24.      * 开始时间  
  25.      */  
  26.     @TLS  
  27.     private static long startTime = 0;   
  28.   
  29.     /**  
  30.      * 方法开始时调用  
  31.      */  
  32.     @OnMethod(clazz = "/com\\.mike\\../", method = "/.+/")   
  33.     public static void startMethod() {   
  34.         startTime = timeMillis();   
  35.     }   
  36.   
  37.     /**  
  38.      * 方法结束时调用<br>  
  39.      * Kind.RETURN这个注解很重要  
  40.      */  
  41.     @SuppressWarnings("deprecation")   
  42.     @OnMethod(clazz = "/com\\.mike\\../", method = "/.+/", location = @Location(Kind.RETURN))   
  43.     public static void endMethod() {   
  44.   
  45.         print(strcat(strcat(name(probeClass()), "."), probeMethod()));   
  46.         print("  [");   
  47.         print(strcat("Time taken : ", str(timeMillis() - startTime)));   
  48.         println("]");   
  49.     }   
  50. }  
import static com.sun.btrace.BTraceUtils.name;
import static com.sun.btrace.BTraceUtils.print;
import static com.sun.btrace.BTraceUtils.println;
import static com.sun.btrace.BTraceUtils.probeClass;
import static com.sun.btrace.BTraceUtils.probeMethod;
import static com.sun.btrace.BTraceUtils.str;
import static com.sun.btrace.BTraceUtils.strcat;
import static com.sun.btrace.BTraceUtils.timeMillis;

import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.Kind;
import com.sun.btrace.annotations.Location;
import com.sun.btrace.annotations.OnMethod;
import com.sun.btrace.annotations.TLS;

/**
 * 监控方法耗时
 * 
  */
@BTrace
public class PrintTimes {

    /**
     * 开始时间
     */
    @TLS
    private static long startTime = 0;

    /**
     * 方法开始时调用
     */
    @OnMethod(clazz = "/com\\.mike\\../", method = "/.+/")
    public static void startMethod() {
        startTime = timeMillis();
    }

    /**
     * 方法结束时调用<br>
     * Kind.RETURN这个注解很重要
     */
    @SuppressWarnings("deprecation")
    @OnMethod(clazz = "/com\\.mike\\../", method = "/.+/", location = @Location(Kind.RETURN))
    public static void endMethod() {

        print(strcat(strcat(name(probeClass()), "."), probeMethod()));
        print("  [");
        print(strcat("Time taken : ", str(timeMillis() - startTime)));
        println("]");
    }
}

 

分享到:
评论

相关推荐

    ADAMS入门详解与实例.pdf

    ADAMS入门详解与实例

    adams入门详解与实例

    由于提供的文件信息部分存在重复内容以及与标题“ADAMS入门详解与实例”不相关的信息,我会忽略这部分重复及无关内容,并直接从给定的标题和描述中提取知识点。 ADAMS(Automatic Dynamic Analysis of Mechanical ...

    ADAMS 入门到精通实例精讲二 仿真源文件

    本实例精讲将带你从基础到深入地掌握ADAMS的使用技巧和精髓,通过实际操作来提升对软件的理解和应用能力。 在ADAMS中,我们首先需要了解的是基本概念和工作流程。多体动力学涉及到物体之间的相互作用,包括力、速度...

    Adams入门详解与实例(李增刚).pdf

    ### Adams入门详解与实例知识点梳理 #### 一、Adams软件概述 - **定义与应用领域**:Adams是一款世界领先的多体动力学仿真软件,主要用于机械系统的动态模拟与分析,能够帮助工程师们准确地预测产品在实际工作环境...

    labview入门开发100实例及对应部分vi

    本资料“labview入门开发100实例及对应部分vi”旨在帮助初学者快速掌握LabVIEW的基本操作和编程技巧。 1. **图形化编程基础**:LabVIEW的核心是G语言,即图形化编程语言。通过拖拽函数节点和连线来构建程序,这种...

    googleEarth入门资料和例子(VC 6.0)

    googleEarth入门资料和例子(VC 6.0),基本入门资料和两个例子!googleEarth入门资料和例子(VC 6.0),基本入门资料和两个例子!googleEarth入门资料和例子(VC 6.0),基本入门资料和两个例子!googleEarth入门资料和例子...

    springmvc的入门例子

    这个入门例子是为初学者设计的,旨在帮助他们快速理解和上手Spring MVC。 首先,我们需要理解Spring MVC的基本组件: 1. **DispatcherServlet**:这是Spring MVC的核心组件,作为前端控制器接收所有的HTTP请求,并...

    adams入门实例与讲解 第二版

    adams 入门与提高最推荐的书籍,有大量实例,适合初学者 。

    C++Builder 实例入门

    C++Builder 实例入门 C++Builder 实例入门 C++Builder 实例入门

    可编程控制器入门与应用实例西门子S7200系列.pdf

    可编程控制器入门与应用实例西门子S7200系列

    阿里云Ecs入门使用

    为了确保用户能够顺利入门使用阿里云ECS,本文将详细介绍其使用方法,包括实例配置、操作系统更换、快照与镜像使用、磁盘扩容、配置升降、安全组操作等核心知识点。 首先,了解阿里云ECS的基本概念至关重要。ECS...

    qt 学习经典入门实例

    Qt 学习经典入门实例 Qt 是一个跨平台的应用程序开发框架,由 Nokia 公司开发,主要用于开发 GUI 程序。Qt Designer 是 Qt 中的一个重要组件,用于设计和构建图形用户界面。 Qt 学习经典入门实例 本文将通过一...

    NASTRAN快速入门与实例

    李增刚的书 比较基础 也比较简单明了 对了解nastran卡片文件和格式有很大的帮助

    ADAMS入门详解与实例

    ### ADAMS入门详解与实例 #### 知识点概述 ADAMS(Automatic Dynamic Analysis of Mechanical Systems)是一款广泛应用于机械系统动力学仿真分析的软件,由美国MDI公司开发。该软件主要利用虚拟样机技术,对复杂...

    使用Protege创建本体进行推理-入门实例

    在“使用Protege创建本体进行推理-入门实例”中,我们将探讨如何通过Protege 5.2构建一个简单的生物分类本体,并利用内置的HermiT推理机进行推理。 首先,我们需要理解本体的基本构成。在这个实例中,我们有两类...

    C#入门小例子

    本资源“C#入门小例子”是为初学者准备的,它包含了一百个实例程序,旨在帮助新手快速掌握C#的基础知识和编程技巧。 首先,C#(读作"C Sharp")是微软公司于2000年推出的一种面向对象的编程语言,它基于.NET框架,...

    51单片机轻松入门与典型实例

    《51单片机轻松入门与典型实例》是一本针对初学者设计的教程,旨在帮助读者从零开始学习51单片机的开发。51单片机是微控制器领域中最基础、最广泛使用的型号之一,它在电子工程、自动化、物联网等领域的应用十分广泛...

    FPGA应用开发入门与典型实例资料代码大全

    《FPGA应用开发入门与典型实例资料代码大全》是一份专为初学者和有经验的工程师准备的资源集合,涵盖了FPGA(Field-Programmable Gate Array)开发的基础知识及多个实际应用案例。通过这份资料,你可以深入理解FPGA...

    QT学习入门及开发实例

    通过"QT学习入门"和"QT5开发及实例"的学习,开发者不仅可以掌握QT的基础知识,还能进一步提升在QT5框架下的应用开发能力,为构建高质量、跨平台的应用程序打下坚实基础。结合PDF说明和代码调试,学习效果将更为显著...

    非常棒的 Vue3 Element 系统解决方案 vue3快速入门、vue3实用入门到熟练实例

    非常棒的 Vue3 Element 统解决方案 vue3快速入门、vue3实用入门到熟练实例 学习了vue3官网、看了视频好像感觉知道了,但实际又不会建项目。这个项目就是上你从入门到熟练的实例。 该方案作为一套多功能的后台框架...

Global site tag (gtag.js) - Google Analytics