2012-12-24 49 views
6

我使用VisualVM上看到我的應用程序很慢。但它不顯示所有方法,可能不會顯示延遲應用程序的所有方法。爲什麼在VisualVM Profiler中不顯示所有方法?

我有一個實時應用程序(聲音處理),並有幾百微秒的時間不足。

VisualVM有可能隱藏自己速度很快的方法嗎?

UPDATE 1

我由取樣器和猜測發現緩慢方法。從關閉的調試記錄中調用了toString()方法,但花費時間。

Settings幫助,現在我知道如何看到它:它取決於Start profiling from選項。

+0

您使用的是採樣器還是分析器?採樣器,井樣本,在一個確定的時間間隔。分析器更精確,但速度更慢。 –

+0

調試日誌記錄都應該有包圍'如果(log.isDebugEnabled()){'或類似的,以避免字符串連接和其他事情發生在你的日誌調用。 –

+0

另請參閱https://blogs.oracle.com/nbprofiler/entry/profiling_with_visualvm_part_1和https://blogs.oracle.com/nbprofiler/entry/profiling_with_visualvm_part_2以獲取有關概要分析以及如何設置概要分析根和儀器過濾器的更多信息。 –

回答

5

我現在沒有在我面前,但在開始分析之前,默認情況下會隱藏一個設置窗格,並允許您輸入正則表達式來過濾掉方法。默認情況下,它會過濾掉很多核心的JDK內容。

10

除了由Ryan斯圖爾特提到的過濾器,這裏有幾個原因的方法可能不會出現在探查其他原因:

  • 採樣曲線本身隨機:的當前堆棧的樣本所有線程每N毫秒採取一次。實際執行但在運行過程中沒有捕獲到任何樣本的某些方法將不會顯示。這通常不會太成問題,因爲它們沒有出現在任何示例中,這意味着很有可能這些方法不佔用運行時的很大一部分。
  • 當在visualvm中使用基於檢測的採樣(稱爲「CPU分析」)時,需要定義分析方法的入口點(「開始分析自」選項)。我發現這個故障在默認包中的方法,也不會在其中當簡檔附後(當前調用期間當前運行的方法接送時間 - 它會得到以後調用這可能是因爲直到當前調用完成後纔會調用已插裝的方法
  • 採樣受基於堆棧跟蹤的性能分析的潛在嚴重問題影響,這是樣本只能在代碼中的安全點採集。的要求,每個線程被強制到一個安全點,然後堆取。在某些情況下,你可能在你的代碼中的熱點,它確實沒有安全點輪詢(常見的簡單循環的JIT可以保證一個固定的號碼後終止的迭代),與一些代碼進行交互,這些代碼確實有一個安全點輪詢。你的棧將始終顯示你的進程在安全點代碼中,永遠不會在安全點NT免費代碼,即使後者可能佔用大部分CPU時間。
+0

爲什麼循環不會執行安全點輪詢? – Geek

+0

可數循環默認情況下不具有安全點,以使其保持快速。例如看到這個bug: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6869327 這是添加一個標誌來關閉此行爲(但它默認情況下)。 – BeeOnRope

+0

可你也試試回答[我這個問題(http://stackoverflow.com/questions/17839933/what-are-safe-points-and-safe-point-polling-in-context-of-profiling? lq = 1)這是閱讀你的答案的結果。 – Geek

相關問題