2015-04-01 122 views
4

考慮下面兩個簡單的Java類:如何在Java中跟蹤方法調用?

第一例

class Computer { 
    Computer() { 
     System.out.println("Constructor of Computer class."); 
    } 
    void On() { 
     System.out.println("PC turning on..."); 
    } 
    void working() { 
     System.out.println("PC working..."); 
    } 
    void Off() { 
     System.out.println("PC shuting down..."); 
    } 
    public static void main(String[] args) { 
     Computer my = new Computer(); 
     Laptop your = new Laptop(); 
     my.On(); 
     my.working(); 
     your.On(); 
     your.working(); 
     my.Off(); 
     your.Off(); 
    } 
} 

第二個例子

class Laptop { 
    Laptop() { 
     System.out.println("Constructor of Laptop class."); 
    } 
    void On() { 
     System.out.println("Laptop turning on..."); 
    } 
    void working() { 
     System.out.println("Laptop working..."); 
    } 
    void Off() { 
     System.out.println("Laptop shuting down..."); 
    } 
} 

程序運行後,我該如何追蹤(1)對象調用哪種方法(2)以及多少次?

只是有點精確,我可能有100個類和1000個對象,每個對象調用100個方法。我希望能夠跟蹤(在我運行程序之後),哪個對象調用哪個方法以及多少次。

感謝您的任何建議。

+0

你是詢問更復雜的或一般的例子嗎?從這個例子中可以明顯看出,因爲每個類只有一個實例,並且沒有繼承。 – 2015-04-01 03:18:06

+1

@DanielNugent我正在尋找一個在任何情況下使用的答案。我可能有100個類和1000個對象調用每100個方法。我希望能夠跟蹤(在我運行程序之後),哪個對象調用哪個方法以及多少次。謝謝 - 喬治 – george24 2015-04-01 03:37:48

+0

@ 1sand0s謝謝,我是新來的。我可能對代碼格式不太瞭解。 – george24 2015-04-01 03:39:46

回答

8

此打印線中的所有線程中的所有對象的每個方法調用:

Runtime.traceMethodCalls() (deprecated/NOP in Java 9)

而且

Runtime.traceInstructions (deprecated/NOP in Java 9)

您可以使用呼叫追蹤像    housemd    或    btrace    或    inTrace

對於更復雜的分析,您可以使用調用圖形工具如這一個:

(這裏是關於這個問題article

過時方法上面被提名去除,因爲現在已經有JVM具體的替代品:

  • Java Flight Recorder         作爲build 56的一部分,JDK 7。需要使用的商業許可在生產
  • VisualVM                                             免費/流行的第三方

這兩個工具都非常易於安裝並開始收集信息並具有很好的GUI界面。它們連接到正在運行的JVM進程,並允許線程快照和各種其他類型的診斷(Visual VM有很多可用的插件,但如果您想要超出默認行爲,則可能需要一段時間才能進行配置和理解,而JFR默認配備更多)。

此外,請不要低估JVM分佈式命令行實用程序($JAVA_HOME/bin)的用處,以執行一些易於訪問的診斷。

  • jstack         棧跟蹤
  • jmap             存儲器映射
  • jstat            個  JVM統計監測
  • jhat                 堆分析工具
  • jdb                   調試
  • jinfo               Java進程或核心文件的配置信息
+1

請注意,此方法以及traceInstructions()是[棄用](http://download.java.net/java/jdk9/docs/api/java/lang/Runtime.html#traceMethodCalls-boolean-)從Java 9開始。 – asgs 2017-01-19 09:28:14

+1

另外,請注意,這些方法不僅僅被棄用,而且也變成了no-op,所以用戶在遷移到JDK 9時應尋找替代方案。 – asgs 2017-01-19 12:33:49