性能主题

使用BTrace性能跟踪

  BTrace是一个开源项目,开始于2007年,名声鹊起得益于2008年的JavaOne会议。

  BTrace有助于我们解决针对复杂的代码追查问题,包括代码错误的,不可预测的流量,并发性问题和性能问题,通常都是很难重现的情况下发生的。

  BTrace动态(无需重新启动应用程序)改变应用程序的字节码。测量的目标可以在一个特定的代码区域。如果超出此范围使用,可能会损害应用程序的流量,因此是禁止通过验证。

  例如,让我们尝试解决以下问题 - 每天一次偶尔的重要文件被删除。我们希望找到是哪行代码干这个坏事。因此,我们想修改'删除'方法的java.io.File代码,加入打印调用线程的堆栈跟踪。 BTrace可以帮助我们做到这一点,通过写一个短和直接的Java代码:

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

@BTrace
public class HelloWorld {

@OnMethod(clazz="java.io.File",method="")
public static void onNewFileCreated(String fileName) {
   BTraceUtils.println("New file is being created");
   BTraceUtils.println(fileName);
}

Btrace代码非常有AOP面向方面编程特点。每个BTrace脚本由探头Probes (切入点方面pointcuts)和Actions操作(advice)组成。探针Probe可以在以下地方:

  • Method entry/exit
  • Line number
  • Field updated/accessed
  • Method call/return (within specified method(s))
  • Exception throw (before)
  • Synchronization entry/exit
  • Timer
  • Constructor entry

Btrace原理如下:

在目标JVM是一个动态插入BTrace的代理。 BTrace客户端(无论是BTrace命令行或Visual VM的 BTrace插件)将命令发送到代理,并得到响应。 BTrace代理测量类被加载到目标JVM并重新加载已加载的类。