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

转 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("]");
    }
}

 

分享到:
评论

相关推荐

    嵌入式MCGS串口通信快速入门及编程实例_第1章_MCGS简介.pdf

    嵌入式MCGS串口通信快速入门及编程实例_第1章_MCGS简介.pdf嵌入式MCGS串口通信快速入门及编程实例_第1章_MCGS简介.pdf嵌入式MCGS串口通信快速入门及编程实例_第1章_MCGS简介.pdf嵌入式MCGS串口通信快速入门及编程...

    ADAMS入门详解与实例.pdf

    ADAMS入门详解与实例

    adams入门详解与实例

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

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

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

    FPGA应用开发入门与典型实例教程

    《FPGA应用开发入门与典型实例教程》是一本旨在引导初学者快速掌握FPGA(Field-Programmable Gate Array)技术的教程。FPGA是一种可编程逻辑器件,它允许用户根据设计需求自由配置其内部逻辑结构,广泛应用于通信、...

    《C#入门经典》全书例子代码

    在提供的压缩包文件“C#入门经典全书例子代码”中,包含了书中每一个章节实例的完整源代码。这些代码是学习和理解C#的关键资源,因为它们将理论知识与实践相结合,使读者能够亲手运行并调试程序,从而更深刻地领会C#...

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

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

    springmvc的入门例子

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

    adams入门实例与讲解 第二版

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

    btrace_extend-master

    2. **安全性**:BTrace使用JDK的动态代理机制,确保只在安全的点插入探查代码,避免引发运行时错误或性能下降。 3. **实时性能分析**:通过BTrace,你可以实时查看方法调用的时间、对象创建频率、内存分配情况等,...

    C 语言入门题目 经典实例 小游戏设计.zip

    C 语言入门题目 经典实例 小游戏设计.zipC 语言入门题目 经典实例 小游戏设计.zipC 语言入门题目 经典实例 小游戏设计.zipC 语言入门题目 经典实例 小游戏设计.zipC 语言入门题目 经典实例 小游戏设计.zipC 语言入门...

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

    下面是对《可编程控制器入门与应用实例 西门子S7-200系列.pdf》中可能包含的知识点的总结: 1. PLC基本概念与原理 - 可编程逻辑控制器定义及其在自动化中的作用。 - PLC系统结构与工作原理,包括CPU、存储器、I/O...

    C++Builder 实例入门

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

    开关电源设计入门与实例解析 张占松.pdf

    开关电源设计入门与实例解析是一本面向初学者和行业工程师的实用工具书,旨在通过基础知识的讲解和具体实例的分析,帮助读者掌握开关电源设计的核心技术。 首先,我们需要理解开关电源的基本工作原理。开关电源的...

    汇编语言入门例子

    "汇编语言入门例子"这个压缩包文件提供了一些基础的汇编语言编程实例,非常适合想要入门汇编的朋友们学习。 汇编语言的核心概念包括指令集、寄存器、地址和操作码。每个汇编程序都是由一系列指令构成的,这些指令...

    React 入门实例教程

    React 入门实例教程React 入门实例教程React 入门实例教程React 入门实例教程

    明日科技C#开发入门及项目实战

    实例011 使用值类型和引用类型输出不同的字段 实例012 判断当前系统日期是星期几 实例013 定义局部变量输出不同的字段 实例014 定义循环内部变量并输出变量的值 实例015 定义常量计算圆的周长 实例016 使用“+”编写...

    NASTRAN快速入门与实例

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

    MSC.PATRAN & MSC.NASTRAN入门和实例

    本书是关于MSC.Software公司旗下两款著名工程软件——MSC.PATRAN和MSC.NASTRAN的入门指南,尤其适合工程技术人员、理工科院校学生及教师等掌握有限元分析软件的使用方法。 ### 第一部分:MSC.Software公司简介 MSC...

Global site tag (gtag.js) - Google Analytics