java性能监控工具-btrace

btrace是sun推出的一款java性能监控工具,利用java agent 和 jvm attach技术,可以不停机的情况下监控线上情况,并且做到最少的侵入,占用最少的系统资源。
详细见官方文档
另外btrace有很严格的限制,比如拼接字符串、循环、递归、以及我们平时经常用的一些方法都不可以用,他有他自己专门的类库。
btrace还提供了VisualVM Plugin 以及Netbeans Plugin。

具体使用如下
1.下载btrace包 http://kenai.com/projects/btrace/downloads/directory/releases。
2.设置环境变量。
3.定制自己需要的脚本。
4.jps命令查出需要监控的jvm pid。
5.调用命令 btrace <pid> <自己定制的脚本>  <输出文件> eg:btrace 3045 PrintExecuteTime.java > time.log

我经常使用的功能一是监控某些方法的耗时,二是查看某些方法的参数值,三是监控内存使用情况。

脚本举例如下
1.监控方法参数(数组)

Java代码 复制代码
  1. import static com.sun.btrace.BTraceUtils.print;   
  2. import static com.sun.btrace.BTraceUtils.printArray;   
  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.   
  7. import com.sun.btrace.annotations.BTrace;   
  8. import com.sun.btrace.annotations.OnMethod;   
  9.   
  10. @BTrace  
  11. public class PrintArgArray {   
  12.   
  13.     /**  
  14.      * 此方法打印出Test类中的mergeArray(Long[] arrayOne, Long[] arrayTwo)方法传入的参数  
  15.      * 参数名字一定要和监控对象的方法参数名字一致  
  16.      *   
  17.      * @param arrayOne 监控参数一  
  18.      * @param arrayTwo 监控参数二  
  19.      * @author jerry  
  20.      */  
  21.     @OnMethod(clazz = "com.jerry.test.Test", method = "mergeArray")   
  22.     // 此处写明要监控的包、类、方法等  可以使用正则匹配   
  23.     public static void anyRead(Long[] arrayOne, Long[] arrayTwo) {   
  24.         // 打印监控的类名   
  25.         print(probeClass());   
  26.         print("  [");   
  27.         // 打印监控的方法名   
  28.         print(probeMethod());   
  29.         println("]");   
  30.   
  31.         if (arrayOne != null) {   
  32.             printArray(arrayOne);   
  33.         } else {   
  34.             println("the arguments is null!");   
  35.         }   
  36.   
  37.         if (arrayTwo != null) {   
  38.             printArray(arrayTwo);   
  39.         } else {   
  40.             println("the arguments is null!");   
  41.         }   
  42.     }   
  43.   
  44. }  
import static com.sun.btrace.BTraceUtils.print;
import static com.sun.btrace.BTraceUtils.printArray;
import static com.sun.btrace.BTraceUtils.println;
import static com.sun.btrace.BTraceUtils.probeClass;
import static com.sun.btrace.BTraceUtils.probeMethod;

import com.sun.btrace.annotations.BTrace;
import com.sun.btrace.annotations.OnMethod;

@BTrace
public class PrintArgArray {

    /**
     * 此方法打印出Test类中的mergeArray(Long[] arrayOne, Long[] arrayTwo)方法传入的参数
     * 参数名字一定要和监控对象的方法参数名字一致
     * 
     * @param arrayOne 监控参数一
     * @param arrayTwo 监控参数二
     * @author jerry
     */
    @OnMethod(clazz = "com.jerry.test.Test", method = "mergeArray")
    // 此处写明要监控的包、类、方法等  可以使用正则匹配
    public static void anyRead(Long[] arrayOne, Long[] arrayTwo) {
        // 打印监控的类名
        print(probeClass());
        print("  [");
        // 打印监控的方法名
        print(probeMethod());
        println("]");

        if (arrayOne != null) {
            printArray(arrayOne);
        } else {
            println("the arguments is null!");
        }

        if (arrayTwo != null) {
            printArray(arrayTwo);
        } else {
            println("the arguments is null!");
        }
    }

}


2.监控使用时间

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.  * @author jerry  
  20.  */  
  21. @BTrace  
  22. public class PrintTimes {   
  23.   
  24.     /**  
  25.      * 开始时间  
  26.      */  
  27.     @TLS  
  28.     private static long startTime = 0;   
  29.   
  30.     /**  
  31.      * 方法开始时调用  
  32.      */  
  33.     @OnMethod(clazz = "/com//.jerry//../", method = "/.+/")   
  34.     public static void startMethod() {   
  35.         startTime = timeMillis();   
  36.     }   
  37.   
  38.     /**  
  39.      * 方法结束时调用<br>  
  40.      * Kind.RETURN这个注解很重要  
  41.      */  
  42.     @SuppressWarnings("deprecation")   
  43.     @OnMethod(clazz = "/com//.jerry//../", method = "/.+/", location = @Location(Kind.RETURN))   
  44.     public static void endMethod() {   
  45.   
  46.         print(strcat(strcat(name(probeClass()), "."), probeMethod()));   
  47.         print("  [");   
  48.         print(strcat("Time taken : ", str(timeMillis() - startTime)));   
  49.         println("]");   
  50.     }   
  51. }  
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;

/**
 * 监控方法耗时
 * 
 * @author jerry
 */
@BTrace
public class PrintTimes {

    /**
     * 开始时间
     */
    @TLS
    private static long startTime = 0;

    /**
     * 方法开始时调用
     */
    @OnMethod(clazz = "/com//.jerry//../", method = "/.+/")
    public static void startMethod() {
        startTime = timeMillis();
    }

    /**
     * 方法结束时调用<br>
     * Kind.RETURN这个注解很重要
     */
    @SuppressWarnings("deprecation")
    @OnMethod(clazz = "/com//.jerry//../", method = "/.+/", location = @Location(Kind.RETURN))
    public static void endMethod() {

        print(strcat(strcat(name(probeClass()), "."), probeMethod()));
        print("  [");
        print(strcat("Time taken : ", str(timeMillis() - startTime)));
        println("]");
    }
}


3.监控内存

Java代码 复制代码
  1. import static com.sun.btrace.BTraceUtils.*;   
  2. import java.lang.management.MemoryUsage;   
  3.   
  4. import com.sun.btrace.annotations.BTrace;   
  5. import com.sun.btrace.annotations.OnLowMemory;   
  6.   
  7. /**  
  8.  * 监控内存使用  
  9.  *   
  10.  * @author jerry  
  11.  */  
  12. @BTrace  
  13. public class PrintMemory {   
  14.   
  15.     /*  
  16.      * 指定内存区域低于一定的界限的时候才内存使用打印数据<br> 也可以指定时间间隔打印内存使用  
  17.      */  
  18.     @OnLowMemory(pool = "Tenured Gen", threshold = 6000000)   
  19.     public static void printMem(MemoryUsage mu) {   
  20.         print("MemoryUsage : ");   
  21.         println(mu);   
  22.         print("FreeMem : ");   
  23.         println(freeMemory());   
  24.         print("Heap:");   
  25.         println(heapUsage());   
  26.         print("Non-Heap:");   
  27.         println(nonHeapUsage());   
  28.     }   
  29. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值