2009-12-12 28 views
45

在Java VisualVM中,是否有任何方法顯示總方法時間,而不是「自我時間」? (後者不是特別有用,因爲它沒有告訴你有多少時間實際運行的方法。)Java VisualVM中的總方法時間

如果沒有,是否有任何獨立的免費Java分析器計算總方法時間?

回答

47

查看「快照」視圖中的跟蹤數據可以查看總時間和自我時間。

按關於結果表的「快照」按鈕。這將創建一個新的選項卡,其中包含一個「調用樹」視圖,該視圖將自我與總時間分開。 「組合」視圖還提供了這些信息,但將屏幕空間與「標準概覽視圖」類似的「熱點」視圖分開。

快照可以從標準的「Profiler」或「Sampler」數據創建。但是,「Profiler」快照只能在應用程序關閉之前創建,而「Sampler」則可以隨時創建。

(以上信息基於VisualVM 1.3。1)

+4

這個答案是最深刻和有益的。我做了一個簡短的截屏:http://rhnh.net/2011/08/03/profiling-clojure – 2011-08-03 10:46:44

+0

澤維爾,謝謝你的截屏。它說得很清楚。 – 2014-10-21 08:25:23

-3

你可以使用一個

long startTime = System.currentTimeMillis(); 

在beggining

long endTime = System.currentTimeMillis(); 

終於得到結果

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

結束 - 開始......否則你最終得到類似於:0-100 = -100 insead的100-0 = 100. – TofuBeer 2009-12-12 03:34:14

+0

感謝你的支持,我想我可能已經倒退了...... – Brendan 2009-12-12 04:02:54

+8

使用系統.nanoTime(),currentTimeMillis()由於os中斷率而容易出錯:http://blogs.sun.com/dholmes/entry/inside_the_hotspot_vm_clocks – 2009-12-14 08:47:24

1

有一個簡單的方式來獲得總時間佔時鐘執行時間的百分比(而不是毫秒)。只需使用ctrl-break在你等待的時候獲得一堆堆棧照片即可。其中包含例程的部分是所花時間的百分比。準確度取決於您拍攝的次數。如果您只是在尋找問題所在,則不需要精確的時間測量。 Here's a short explanation of how it works.

7

只需創建性能分析結果的快照。你將獲得掛鐘時間以及在那裏的自我時間。

-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 
     } 
    } 
} 

輸出: 開始:週三5月26日17時24分18秒EDT 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/

原產地來源: http://www.senthilb.com/2010/05/javaassist-byte-code-enhancement.html

0

我想你想知道每個方法執行需要多少時間。你會想用JETM來監控性能。 這會給你入場時間,退出時間和每種方法的時差。你會發現哪種方法需要花費多少時間。

如果您在使用Spring那麼就很容易整合JETM http://jetm.void.fm/howto/spring_2_x_integration.html

0

可以使用JProfiler的或者一些javaagent工具來監控方法you.there執行時間是在GitHub的一些開源工具,如simpleAPM。