Java VisualVM中的总方法时间

时间:2009-12-12 02:22:22

标签: java profiling visualvm

在Java VisualVM中,有没有办法显示总方法时间,而不是“自我时间”? (后者并不是特别有用,因为它没有告诉你任何方法实际运行的时间。)

如果没有,是否有任何独立的免费Java分析器可以计算总方法时间?

7 个答案:

答案 0 :(得分:52)

在“快照”视图中查看跟踪数据,可以查看总时间和自身时间。

按下结果表中显示的“快照”按钮。这将创建一个新选项卡,其中包含一个“调用树”视图,该视图可以分解自我与总时间。 “组合”视图还提供此信息,但使用类似于标准概要分析视图的“热点”视图拆分屏幕空间。

可以从标准“Profiler”或“Sampler”数据创建快照。但是,“Profiler”快照只能在应用程序关闭之前创建,而“Sampler”快照可以随时创建。

(以上信息基于VisualVM 1.3.1)

答案 1 :(得分:7)

只需拍摄分析结果的快照。你将获得挂钟时间以及那里的自我时间。

答案 2 :(得分:1)

有一种简单的方法可以将例程的总时间作为挂钟执行时间(而不是毫秒)的百分比。在等待它时,只需使用ctrl-break来获取一堆stackshot。包含例程的部分是它所花费的时间的百分比。准确度取决于你拍摄的镜头数量。如果您只是在寻找问题所在,那么您就不需要精确的时间测量。 Here's a short explanation of how it works.

答案 3 :(得分:0)

我想你想知道每个方法执行需要多少时间。您可能希望使用JETM来监视性能。 这将为您提供每种方法的入口时间,退出时间和时间差。你会发现哪种方法花了多少时间。

如果您使用的是Spring,则可以轻松集成JETM http://jetm.void.fm/howto/spring_2_x_integration.html

答案 4 :(得分:0)

您可以使用jprofiler或一些javaagent工具来监视方法执行时间。在github上有一些开源工具,比如simpleAPM。

答案 5 :(得分:-1)

JavaAssist是一个类库,可以在不触及源的情况下操作Java字节代码。我们来举一个测量的例子 执行方法所花费的时间。

public class Subject {
    /**
     * Timetaken for start & end of the method
     * 
     * @throws InterruptedException
     */
    public void method2() throws InterruptedException {
        // Some business logic :)
        Thread.sleep(2000);
    }
}

要衡量执行subject.method2()所需的时间,您可以通过添加代码的开始和结束来增强Subject.methods()

public class JavaAssist {
    public static void main(String[] args) {
        timeTaken();
    }

    public static void timeTaken() {
        try {
            ClassPool p = ClassPool.getDefault();
            CtClass cc = p.get("Subject");
            CtMethod meth2 = cc.getDeclaredMethod("method2");
            meth2.insertBefore("System.out.println(\" Start : \"+new java.util.Date());");
            meth2.insertAfter("System.out.println(\" End : \"+new java.util.Date());");
            // cc.writeFile(".");
            Class c = cc.toClass();
            Subject s = (Subject) c.newInstance();
            s.method2();
            cc.detach();
        } catch (Exception e) {
            // suppressed
        }
    }
}

输出: 开始时间:2010年5月26日星期三17:24:18 EDT 2010 结束:2010年5月26日星期三17:24:20 EDT 2010

参考 http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial.html#read

http://www.csg.is.titech.ac.jp/~chiba/javassist/html/

Origin来自: http://www.senthilb.com/2010/05/javaassist-byte-code-enhancement.html

答案 6 :(得分:-3)

你可以使用

 long startTime = System.currentTimeMillis();

开头

 long endTime = System.currentTimeMillis();

最后得到结果

 long result = endTime - startTime; //Note, part might be backwards, I don't
                                    //Remember