2010-07-14 23 views
19

我試圖剖析我的Java應用程序,只是爲了找出大部分時間花在哪些方法上。鑑於對TPTP的反應不佳,我想我會給Java VisualVM一個去。在Java VisualVM中看不到我自己的應用程序方法

這一切似乎都相當簡單 - 除了我似乎無法得到任何一致或有用的東西外。

我似乎無法看到與我自己的代碼有關的任何東西 - 我得到的只是一大堆調用java *。方法之類的東西。

我試過限制儀器只有我自己的軟件包,這似乎減少了儀器的方法數量,但我似乎從來沒有看到我自己的。

每次運行時,我都會收到不同數量的方法,從10到1000不等。 我已經嘗試在我的應用程序的開始時進入睡眠狀態,以確保在應用程序開始執行任何有趣的操作之前啓動並運行VisualVM,以確保它在有趣的東西運行時進行分析。

有什麼我必須做,以確保我的課得到儀器? 是否有計時問題? ..喜歡,必須等待類加載等? 我也嘗試了兩次運行代碼的膽量,以確保所有的代碼都得到了鍛鍊...

我只是在Eclipse中運行一個帶有main的應用程序。我嘗試過使用Eclipse集成,以便在啓動應用程序時啓動VisualVM - 結果相同。 我也嘗試將應用程序導出爲可運行的應用程序,並從命令行單獨運行,而不是通過Eclipse運行 - 結果相同。

我的應用程序不是一個長時間運行的web應用程序等 - 只是一個主要調用我自己的一些其他類來做一些處理,然後退出。

我很感激任何關於我可能做錯的建議! :)

謝謝!

+0

我不知道這是否會有所作爲,但是您是否編譯了沒有任何調試信息的應用程序?或者你的應用程序使用自定義類加載器? – 2010-07-14 04:02:54

+0

有一個小小的教訓,但簡單而有效的技術:http://stackoverflow.com/questions/266373/one-could-use-a-profiler-but-why-not-just-halt-the-program/317160# 317160 – 2010-07-14 11:59:24

回答

0

我認爲這不僅僅是一個學術問題 - 你想看看你是否可以讓應用程序運行得更快。我想你也不會介意一點「開箱即用」的想法。有許多關於表現的流行想法實際上很模糊。

例如,你說你正在尋找「大部分時間都花費在其中的方法」。如果你的意思是「自我時間」(實際上是在方法中的程序計數器),那麼可能很少,除非你有一些強烈的循環。方法通常通過調用其他方法來花時間,有時做I/O。

另一個模糊的想法是,測量方法時間或計算通話次數可以告訴你非常多的瓶頸問題。瓶頸是特定的代碼行,而不是方法,所以即使你知道大概在哪裏看,你仍然在玩偵探。

所以這些是一些模糊的想法。 Here is a bunch more.讓我建議如何一個思考它,以及如何導致結果。

當你最終修復某些東西時,它會減少一些百分比的執行時間,比如(選擇一個數字)30%,對吧? (否則,你沒有解決任何問題。)好的,在30%的時間裏,它正在做一些事情,這是它不需要做的,因爲後來你擺脫了它。所以,你不需要需要衡量。你需要找出它在做什麼在那個時候,所以你知道該怎麼擺脫。

一個非常簡單的方法是隨機「暫停」它10次(或幾次)。通過查看調用堆棧以及可能的一些數據,瞭解它在做什麼以及爲什麼。在大約3次的時候,你會看到它做了一些你可以擺脫的事情。

你會知道看看百分之多少的樣本顯示它會節省多少錢。 近似就夠了。您可以很容易地看到通過在前後查看節省多少時間。

然後,不要停下來。您已經使應用程序更快。再做一次,並讓它更快。遲早你會得到一個不能讓它變得更快的點,但它可能不止一步。

1

您可以看看Appdynamics lite,它具有很好的功能,例如業務事務發現功能,可以對您的代碼中的特定方法進行的所有調用進行採樣。

lite版本有很多限制,例如10分鐘採樣最大值和30個業務交易發現最大值。

它會是不錯的做同樣的

5

我也是用的VisualVM,這是一種恥辱,因爲它的用戶界面是太棒了,而它的輪廓似乎輸出恐怖掙扎的免費工具。你可以在這裏看到我的問題。

Java VisualVM giving bizarre results for CPU profiling - Has anyone else run into this?

我可以告訴你一對夫婦,我已經瞭解了VisualVM的,似乎做了剖析的方式奇怪的事情。

VisualVM似乎在計算在一個方法(掛鐘時間)內花費的總時間。我在我的應用程序中有一個線程,它啓動了許多其他線程,然後立即阻止在隊列中等待消息。直到其他線程之一發送第一個線程正在等待的消息(應用程序終止時),VisualVM纔會在分析器中註冊此方法。突然,阻塞方法調用支配分析輸出,並被記錄佔用超過80%的應用程序時間。

其他分析器(例如JProfiler和Azul使用的分析器)不會計算被阻塞的線程佔用分析器的時間。這意味着對性能分析可能不感興趣(情況相關)的阻塞方法掩蓋了您正在佔用CPU時間的代碼視圖。

當我跑我的分析我結束了

sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run()

模糊我的分析正確,直到該消息回來等待線程,然後在這兩個完全不相關的方法之間共享頂部位置,以及其他各種不感興趣的方法,這些方法不會出現在其他配置文件中。其次,我認爲非常重要的是方法過濾機制並不像我期望的那樣工作。這意味着我無法過濾掉我正在試圖追蹤這個故事的現狀。

不是一個真正有用的答案。我現在看到的解決方案是支付JProfiler - VisualVM對於這項任務似乎不值得信賴。

+0

我和@ francis-stephens有同樣的問題還沒有找到解決方案 – 2014-05-21 03:13:49

相關問題