2011-08-17 78 views
31

在Java剖析中,似乎所有(免費)道路現在都導致了JDK6中包含的VisualVM剖析器。它看起來像一個很好的程序,每個人都會吹捧你如何「將它附加到正在運行的進程中」作爲一項主要功能。問題是,這似乎是在本地進程上使用它的唯一方法。我希望能夠開始我的程序在分析器中,並且跟蹤它的整個執行個人檔案在VisualVM中執行整個Java程序

我試過使用how to profile application startup with visualvm中描述的-Xrunjdwp選項,但是在兩種傳輸方法(共享內存和服務器)之間,這兩種方法對我都沒有用。 VisualVM似乎沒有與前者的任何集成,而VisualVM拒絕連接到localhost127.0.0.1,所以後者也不好。我還嘗試在我的程序中插入System.in的簡單讀取,以便在執行過程中插入暫停,但在此情況下,VisualVM將阻塞,直到讀取完成,並且不允許您在執行完成之前開始分析。 我也嘗試調查the Eclipse plugin,但該網站上充滿了死鏈接,當我嘗試使用它時,發射器崩潰了NullPointerException(這可能不再準確)。

來自C,這對我來說似乎不是特別困難的任務。我只是錯過了一些東西,或者這是一個不可能的要求嗎?我接受任何類型的建議,包括使用不同的(也是免費的)探查器,並且我不反對命令行。

+0

回答你提到的那個問題,你是否嘗試過'suspend = y',而不是發佈的'suspend = n'?如果是這樣的話,你不需要從'System.in'中讀取。 –

+0

是的,但沒關係。我看不出有什麼辦法將程序連接到VisualVM,而不管「suspend」參數。 – kbolino

+0

在那裏應該有一個「正確」的地方。當然,VisualVM可以看到這個過程。問題是它無法分析它。 – kbolino

回答

19

考慮使用HPROF並使用HPjmeter之類的工具打開數據文件 - 或者只是在您最喜愛的編輯器中讀取生成的文本文件。

Command used: javac -J-agentlib:hprof=heap=sites Hello.java 

SITES BEGIN (ordered by live bytes) Fri Oct 22 11:52:24 2004 
      percent   live   alloc'ed stack class rank self accum  bytes objs  bytes objs trace name 
    1 44.73% 44.73% 1161280 14516 1161280 14516 302032 java.util.zip.ZipEntry 
    2 8.95% 53.67% 232256 14516 232256 14516 302033 com.sun.tools.javac.util.List 
    3 5.06% 58.74% 131504 2 131504  2 301029 com.sun.tools.javac.util.Name[] 
    4 5.05% 63.79% 131088 1 131088  1 301030 byte[] 
    5 5.05% 68.84% 131072 1 131072  1 301710 byte[] 

HPROF能夠呈現CPU使用率,堆分配統計, 的和監視爭用的配置文件。此外,它還可以報告 Java虛擬機中的所有監視器和線程的完整堆轉儲和狀態。

+0

謝謝,那就是我一直在尋找的! – kbolino

+0

隨時樂意提供幫助。 –

11

無需修改應用程序即可解決此問題的最佳方法是根本不使用VisualVM。就其他免費選項而言,您可以使用Eclipse TPTPNetbeans profiler或IDE的任何附件。

如果您可以修改應用程序,在VisualVM中設置分析器時暫停它的狀態,使用VisualVM Eclipse插件很可能會這樣做。我不知道爲什麼你會得到NullPointerException,因爲它似乎在我的工作站上工作。您需要通過提供jvisualvm二進制文件的路徑和JDK的路徑來配置插件;這可以通過訪問Windows上的VisualVM配置對話框完成 - >首選項 - >運行/調試 - >啓動 - > VisualVM配置(如下圖所示)。

Eclipse VisualVM plugin

您還需要配置而不是默認的JDT啓動您的應用程序開始與VisualVM的發射。

所有從Eclipse啓動的應用程序現在都會導致VisualVM自動跟蹤新的本地JVM,前提是VisualVM已經運行。如果您沒有運行VisualVM,那麼該插件將啓動VisualVM,但它也將繼續運行該應用程序。

根據前面的句子推測,顯然在執行任何處理之前讓應用程序停止在main()方法中是非常有用的。但是,這不是暫停申請的主要原因。顯然,VisualVM或其Eclipse插件不允許自動啓動CPU或內存分析器。這意味着這些分析器必須手動啓動,因此需要暫停應用程序。

此外,值得注意的是,在JVM啓動時將標誌:-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y添加到VisualVM中並不能幫助您掛起應用程序並設置分析器。這些標誌旨在幫助您解決使用JDWP協議可以實際連接到JVM的開放端口的配置文件。 VisualVM不使用此協議,因此您必須使用JDB或遠程調試器連接到應用程序;但這並不能解決與配置文件配置相關的問題,因爲VisualVM(至少從Java 6 update 26開始)不允許您在暫停的進程上配置配置文件,因爲它只是不顯示Profiler選項卡。

+0

我不知道是什麼問題,因爲它甚至不給我一個NPE的堆棧跟蹤。無論如何,我一直在尋找更自動化的解決方案,不幸的是VisualVM似乎無法完成任務。 – kbolino

+1

未正確配置插件將導致可重現的'NullPointerException'。在我的系統中,當'JDK Home'設置和'VisualVM Executable'爲空時,任何使用VisualVm啓動器的運行配置都將失敗。 –

3

-Xrunjdwp的建議是不正確的。它只是啓用調試器,並等待調試器附加。由於VisualVM不是調試器,它不能幫助你。但插入System.inThread.sleep()將暫停啓動並允許VisualVM附加到您的應用程序。請務必閱讀Profiling with VisualVM 1Profiling with VisualVM 2以更好地瞭解分析器設置。還要注意的是,可以使用VisualVM中的'Sampler'選項卡來代替配置文件,該選項卡更適合分析整個 java程序的執行情況。正如其他人提到的,您還可以使用NetBeans Profiler,它直接支持應用程序啓動的分析。

3

現在可以使用VisualVM的startup profiler plugin

+1

啓動Profiler告訴它使用VisualVM 1.3.6運行,並且不能用VisualVM 1.8.0加載。所以至少在目前的版本中這是行不通的。 –