介绍
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.
例子
监控某个方法的执行时间
- <strong><em>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("]");
- }
- }</em></strong>
监控所有HTTP request请求的执行时间
- @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, 时间戳)生成对应的调用图。
相关推荐
ADAMS入门详解与实例
由于提供的文件信息部分存在重复内容以及与标题“ADAMS入门详解与实例”不相关的信息,我会忽略这部分重复及无关内容,并直接从给定的标题和描述中提取知识点。 ADAMS(Automatic Dynamic Analysis of Mechanical ...
本实例精讲将带你从基础到深入地掌握ADAMS的使用技巧和精髓,通过实际操作来提升对软件的理解和应用能力。 在ADAMS中,我们首先需要了解的是基本概念和工作流程。多体动力学涉及到物体之间的相互作用,包括力、速度...
### Adams入门详解与实例知识点梳理 #### 一、Adams软件概述 - **定义与应用领域**:Adams是一款世界领先的多体动力学仿真软件,主要用于机械系统的动态模拟与分析,能够帮助工程师们准确地预测产品在实际工作环境...
《FPGA应用开发入门与典型实例教程》是一本旨在引导初学者快速掌握FPGA(Field-Programmable Gate Array)技术的教程。FPGA是一种可编程逻辑器件,它允许用户根据设计需求自由配置其内部逻辑结构,广泛应用于通信、...
下面是对《可编程控制器入门与应用实例 西门子S7-200系列.pdf》中可能包含的知识点的总结: 1. PLC基本概念与原理 - 可编程逻辑控制器定义及其在自动化中的作用。 - PLC系统结构与工作原理,包括CPU、存储器、I/O...
本资料“labview入门开发100实例及对应部分vi”旨在帮助初学者快速掌握LabVIEW的基本操作和编程技巧。 1. **图形化编程基础**:LabVIEW的核心是G语言,即图形化编程语言。通过拖拽函数节点和连线来构建程序,这种...
可编程控制器入门与应用实例西门子S7200系列
扫描完整版
adams 入门与提高最推荐的书籍,有大量实例,适合初学者 。
《FPGA应用开发入门与典型实例资料代码大全》是一份专为初学者和有经验的工程师准备的资源集合,涵盖了FPGA(Field-Programmable Gate Array)开发的基础知识及多个实际应用案例。通过这份资料,你可以深入理解FPGA...
《51单片机轻松入门与典型实例》是一本针对初学者设计的教程,旨在帮助读者从零开始学习51单片机的开发。51单片机是微控制器领域中最基础、最广泛使用的型号之一,它在电子工程、自动化、物联网等领域的应用十分广泛...
C++Builder 实例入门 C++Builder 实例入门 C++Builder 实例入门
李增刚的书 比较基础 也比较简单明了 对了解nastran卡片文件和格式有很大的帮助
开关电源设计入门与实例解析是一本面向初学者和行业工程师的实用工具书,旨在通过基础知识的讲解和具体实例的分析,帮助读者掌握开关电源设计的核心技术。 首先,我们需要理解开关电源的基本工作原理。开关电源的...
adams入门详解与实例.part2.rar
FPGA应用开发入门与典型实例,一本好书,值得推荐
TMS320C66x KeyStone架构多核DSP入门与实例精解.pdf牛金海
本书是关于MSC.Software公司旗下两款著名工程软件——MSC.PATRAN和MSC.NASTRAN的入门指南,尤其适合工程技术人员、理工科院校学生及教师等掌握有限元分析软件的使用方法。 ### 第一部分:MSC.Software公司简介 MSC...
Qt 学习经典入门实例 Qt 是一个跨平台的应用程序开发框架,由 Nokia 公司开发,主要用于开发 GUI 程序。Qt Designer 是 Qt 中的一个重要组件,用于设计和构建图形用户界面。 Qt 学习经典入门实例 本文将通过一...