一段btrace代码
作者: chua | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://www.meichua.com/archives/303.html
最近想要优化一下本地cache,不知道数据的使用情况,故写了一个btrace脚本来做分析,也可以顺便熟悉一下强大的btrace
btrace目前已经到了1.0,可以从下面的地址下载:
https://btrace.dev.java.net/files/documents/8510/135506/btrace-bin.tar.gz
以下是今天写的btrace脚本:
import java.util.Map; import com.sun.btrace.BTraceUtils; import com.sun.btrace.annotations.BTrace; import com.sun.btrace.annotations.OnEvent; import com.sun.btrace.annotations.OnMethod; import com.sun.btrace.annotations.OnTimer; import com.sun.btrace.annotations.Property; /** * @author chua 2010-2-20 16:36:44 */ @BTrace public class CacheProbe { @Property private static Map map = BTraceUtils.newHashMap(); @OnMethod( clazz = "com.meichua.sample.model.Cache", method = "/getAllAttributes|getAllLocators/" ) public static void visitCategory() { if (!BTraceUtils.containsKey(map, "category")) { BTraceUtils.put(map, "category", "yes"); } } @OnMethod(clazz = "com.meichua.sample.model.Cache", method = "/getAreaMap|getAreaTree/") public static void visitArea() { if (!BTraceUtils.containsKey(map, "area")) { BTraceUtils.put(map, "area", "yes"); } } . . . @OnEvent public static void onEvent() { BTraceUtils.println("BTrace probe will print the used original data:"); BTraceUtils.printMap(map); BTraceUtils.println("BTrace program exits!"); BTraceUtils.exit(); } @OnTimer(1000*60*5) public static void ontimer() { BTraceUtils.println("--------------------------------------:"); BTraceUtils.printMap(map); } }
@BTrace 这个annotation表明这个类是个btrace的脚本
@Property 这个annotation标注的field是可以在JMX client中,如jconsole中可以看到
@OnMethod 这个annotation标注要监控的类中的方法,我的例子中,是一个正则表达式,当然还可以是更复杂的正则表达式
@OnEvent 这个annotation表明事件处理时,打印map中的内容,这个事件,可以在运行btrace脚本的控制台中用ctrl+c,再选择2触发
@OnTimer 这个annotation是一个定时器,有定义的时间触发一次执行,打印map内容,时间单位是毫秒
另外: map的创建,操作,打印必须有BTraceUtils的方法创建,在一个事件中,不能调用任何自己写的方法
运行: btrace <pid> CacheProbe.java