zoukankan      html  css  js  c++  java
  • 使用btrace来找出执行慢的方法

    转载于:https://shaojun.name/2016/07/260

    btrace script

    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 MethodTimeCost {
     
        @TLS private static long starttime;
         
        @OnMethod(clazz="/org\..*/", method="/.+/",location=@Location(Kind.ENTRY))
        public static void startExecute() {
            starttime = timeMillis();
        }
         
        @OnMethod(clazz="/org\..*/", method="/.+/",location=@Location(Kind.RETURN))
        public static void endExecute() {
            long timecost = timeMillis() - starttime;
            if(timecost > 50) {
                print(strcat(strcat(name(probeClass()), "."), probeMethod()));
                print("  [");
                print(strcat("Time taken : ", str(timecost)));
                println("]");
            }
        }
    }

    被测试代码:

    package org.shaojun.test;
     
    public class MyTest {
     
        public static void main(String[] args) {
             
             
            for(int i = 0;i < 100; i++) {
                Thread t = new Thread() {
                    @Override
                    public void run() {
                        Slow slow = new Slow();
                        slow.query();
                    }
                };
                t.start();
            }
        }
    }
     
    package org.shaojun.test;
     
    public class Slow {
     
        public void query() {
            while(true) {
                slow();
            }
        }
         
        public void slow() {
            slow2();
        }
         
        public void slow2() {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("helloworld");
        }
    }

    执行以下代码:
    /btrace -cp build 2042 /Users/shaojun/Documents/workspace/btrace/src/MethodTimeCost.java
    其中,2042是被测试代码的java进程id
    /Users/shaojun/Documents/workspace/btrace/src/MethodTimeCost.java是btrace脚本所在位置
    -cp build可以沿用

    以下是btrace下载地址:
    btrace-bin-1.3.7

  • 相关阅读:
    Java项目中加载properties文件的方式
    第十一篇 JVM之运行时数据区<7>: 本地方法栈
    第十七篇 JVM之运行时数据区<13>: 字符串常量池
    第十四篇 JVM之运行时数据区<10>: 对象分配过程
    基于zxing工具生成二维码
    第十八篇 JVM之运行时数据区<14>: 方法区的垃圾收集
    第十六篇 JVM之运行时数据区<12>: 方法区
    第十二篇 JVM之运行时数据区<8>: Java堆
    圣诞
    LeetCode 748 最短补全词
  • 原文地址:https://www.cnblogs.com/zl0372/p/btrace.html
Copyright © 2011-2022 走看看