btrace 实践笔记

btrace简介:

btrace 是一个使用在JAVA平台上面的,安全的,动态跟踪工具。它一般用于动态跟踪正在运行的jAVA程序。

使用说明在这里。下载地址在这里

下载的时候注意版本问题,我最初下载的是release-1.2.3的版本,然后服务器上面的JAVA的版本是1.6.0_32。运行的时候报了这个错。

[java] java.lang.UnsupportedClassVersionError[/java]

这是由于编译release-1.2.3的jdk版本比1.6.0_32要高,但是却运行在较低版本的JVM上面,所以会报这个错,然后我下载了release-1.2.2版本没有这个问题。

btrace安装:

btrace其实不需要安装,直接解压,然后把bin这个目录加到path里面,并且设置BTRACE_HOME为解压目录,然后就可以执行btrace命令测试了。

btrace实践步骤

首先找到运行中java程序的PID(后面会用到).

?

ps -A|grep java

然后

创建脚本:例如TraceObject.java

?

import static com.sun.btrace.BTraceUtils.*;
import com.sun.btrace.annotations.*;

@BTrace public class TraceObject{

@TLS static long beginTime;

@OnMethod(
clazz="com.task.CheckTask",
method="getItem"
)
public static void traceBegin(){
beginTime = timeMillis();
}

@OnMethod(
clazz="com.task.CheckTask",
method="getItem",
location=@Location(Kind.RETURN)
)
public static void trace(long itemId,@Return Object result){
println("---------start-------------");
println(strcat("itemId:",str(itemId)));
println(strcat("result itemName:",str(get(field("com.info.ItemInfoDO","itemIdStr"),result))));
println(strcat(str(sizeof(result)),"bytes"));
println(strcat(strcat("execute time is:",str(timeMillis()-beginTime)),"ms"));
println("method stack:");
jstack();
println("---------end-------------");
}
}

这个脚本主要的作用是监控CheckTask这个类的对象的getItem方法的入参是什么,返回值是什么,返回值占多少个字节(仅仅是该对象占的字节,不包括对象属性指向对象的大小)。以及这个方法的调用堆,以及这个方法的运行时间。

简单介绍下上面用到的几个注解:

@OnMethod 指定需要动态跟踪的类名和方法,其中的location属性表明是在方法执行前监控还是执行完之后监控,默认为执行方法前,如果需要执行完后监控使用[email protected](Kind.RETURN)。

@TLS TLS用来指定Btrace的静态属性为线程本地属性。

另外trace方法的itemId为getItem方法的入参,result为getItem的返回值。

运行

sudo -u admin -H sh btrace 1671 TraceObject.java 

就能看到结果了。

当然btrace还有其他的用法。可以参照user guide 中例子。

资料:http://rdc.taobao.com/team/jm/archives/509 btrace使用简介
       https://kenai.com/projects/btrace/pages/UserGuide  userguide
时间: 2024-08-05 17:50:15

btrace 实践笔记的相关文章

hadoop2.5.2学习及实践笔记(四)—— namenode启动过程源码概览

对namenode启动时的相关操作及相关类有一个大体了解,后续深入研究时,再对本文进行补充 >实现类 HDFS启动脚本为$HADOOP_HOME/sbin/start-dfs.sh,查看start-dfs.sh可以看出,namenode是通过bin/hdfs命令来启动 $ vi start-dfs.sh # namenodes NAMENODES=$($HADOOP_PREFIX/bin/hdfs getconf -namenodes) echo "Starting namenodes o

PHP核心技术与最佳实践--笔记

<?php error_reporting(E_ALL); /* php 5.3引入 延迟静态绑定 */ /* php5.4引入trait,用来实现多层继承 trait Hello{} trait World{} class MyHelloWorld{ use Hello,World; } */ /* php4时代 php是不支持析构函数的*/ /* php中数组索引是字符串,但是没有使用引号,php就将其认为是一个常量,找不到在视为变量 */ /** * php中的异常必须手动 * 可以结合错

udacity android 实践笔记: lesson 4 part a

udacity android 实践笔记: lesson 4 part a 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 联系:1307316一九六八(短信最佳) 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. tips:https://code.csdn.net/titer1/pat_aha/blob/mast

udacity android 实践笔记: lesson 4 part b

udacity android 实践笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 联系:1307316一九六八(短信最佳) 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. tips:https://code.csdn.net/titer1/pat_aha/blob/mast

COMET探索系列一【COMET实践笔记】

转:http://www.cnblogs.com/hackboy/p/3687627.html COMET探索系列一[COMET实践笔记] 这几天在给公司的一个点对点聊天系统升级,之前只是使用简单的ajax轮询方式实现,每5秒钟取一次数据,延时太长,用户体验不是很好,因此打算采用服务器推送技术,故此整理了以下文档,将自己找到的一些资料及心得与大家在此分享.本文主要综述了Comet相关的概念.应用场景.常用的两种实现模型.及PHP实现代码. 概    念:Comet,基于 HTTP 长连接的“服务

前端学习实践笔记--JavaScript深入【1】

这一年中零零散散看过几本javascript的书,回过头看之前写过的javascript学习笔记,未免有点汗颜,突出“肤浅”二字,然越深入越觉得javascript的博大精深,有种只缘身在此山中的感觉,茫茫然而不得其要领,索性在一边写博文中,求得突破,乃至更上一层楼. 看过的书籍推荐: <javascript语言精粹> Douglas Crockford <javascript设计模式> Addy Osmani <javascript设计模式> Ross Harmes

Python编程入门到实践 - 笔记(1,2章)

自学 Python 有段时间了,总是觉得自己基础不牢,想着把看完的两本基础书写个博客做个笔记啥的. 准备在重新看一遍<Python编程入门到实践>,坚持写博客笔记. Python编程入门到实践的前两章笔记,学习的内容如下: 查看当前环境中的 python 版本 python环境的搭建 变量和变量的命名 字符串的打印 修改字符串的大小写 制表符和换行符 删除空白字符 python的整数运算,计算平方,立方 使用 str() 函数 查看当前环境中的 python 版本 命令行下输入 python 

CasperJS实践笔记(3)

CasperJS项目中方法的封装和调用问题,第二个遇到的workflow问题. 在其他代码中有几个方法,比如fun_A,fun_B,fun_C: 现在某个方法调用它们,有一个错误的示范: casper.then(function(){ this.echo("xxxx"); this.wait(function(){ this.echo("AAAA"); }) this.waitForSelector('', function(){ fun_a.call(this);

Android实践笔记-目录

1.让EditText不自动获取焦点 2.PopupWindow工具类 3.滑动冲突解决方案4.OOM出现原因与解决方案 5.三级缓存 6.Java反射 7.Java注解 8.3种消息传递机制的比较:Handler.BroadcastReceiver.EventBus 9.文件读取工具类 10.日志打印工具类 11.分辨率工具类 12.万能适配器 13.线程本地变量ThreadLocal 14.Timer和TimerTask 15.线程池 16.Callable和Future 17.sychro