問題是:VisualVM採樣器按時間顯示調用樹。對於某些方法,取樣器只顯示「自我時間」,所以我看不出是什麼讓這種方法變得緩慢。 Here is an example。
如何增加分析深度?爲什麼VisualVM Sampler沒有提供有關CPU負載(方法時間執行)的完整信息?
回答
是沒有錯的例子。它看起來像updateInfoInDirection()
調用new SequenceInfo()
和SequenceInfo.next()
。 '自我時間'意味着時間花費在方法本身的代碼中(方法updateInfoInDirection()
在採樣線程時位於堆棧底部)。
不幸的是採樣廓當它歸結爲深入分析是相當有限的,由於多種原因:
採樣由採樣週期的限制:例如,VisualVM的目前有一個最小採樣週期爲20ms。現代處理器可以在那個時候執行數百萬條指令 - 當然綽綽有餘可以調用幾個簡短的方法並從中返回。
雖然一個明顯的解決辦法是減少採樣週期,這也將增加分析器對您的應用程序的影響,呈現uncertainty principle的一個很好的例子。
取樣容易被內聯代碼混淆: JVM和任何像樣的編譯器將內聯瑣碎和/或頻繁調用的方法,從而將他們的代碼在其調用者的代碼。採樣分析器無法判斷每種方法的哪些部分實際屬於它,哪些屬於內聯調用。
在VisualVM的自時間的情況下實際上包括兩個方法和任何內嵌代碼的執行時間。
採樣器可能會被高級VM困惑:例如,在現代JVM實現中,方法沒有穩定的表示。想象一下,例如下面的方法:
void A() { ... B(); ... }
當JVM啓動
B()
從字節碼解釋直線,從而採取了相當多的時間,這使得它的採樣可見。然後,一段時間後,JVM決定B()
是一個很好的優化候選,並將其編譯爲本地代碼,從而使其更快。又過了一段時間,JVM可能決定將呼叫內聯到B()
,並將其代碼合併到A()
中。在最好的情況,採樣分析器將顯示這些第一次運行的成本和隨後的所有運行的成本將包含在主叫方所花費的時間。不幸的是,這可能會讓一個沒有經驗的開發人員誤以爲低估了內聯方法的成本。
在最壞的情況,即成本可以被分配給一個兄弟姐妹通話,而不是調用者。例如,我目前使用剖析VisualVM的,其中一個熱點似乎是
ArrayList.size()
方法的應用程序。在我的Java實現中,該方法是一個簡單的字段getter,任何JVM都應該快速內聯。然而,剖析器顯示它作爲一個主要的時間消費者,完全忽略了一堆附近的HashMap
電話,這顯然要貴得多。
避免這些弱點的唯一方法是使用儀器分析器,而不是採樣分析器。檢測分析器,例如VisualVM中的Profiler選項卡提供的分析器實質上記錄了每個方法的入口並退出到選定的代碼中。不幸的是,插裝廓線儀對異形代碼相當沉重的影響:
他們周圍插入每一個方法,它完全改變的方法是由JVM處理方式的監管碼。即使是簡單的字段getter/setter方法也可能因爲額外的代碼而不再內聯,從而導致任何結果偏差。分析人員通常試圖解釋這些變化,但並不總是成功的。
他們造成巨大的慢起伏的輪廓代碼,這使得它們完全不適合用於監控完整的應用程序。
由於這些原因插裝分析器大多適合於分析已經被使用另一種方法,例如一個取樣分析器檢測的熱點。通過僅檢測選定的一組類和/或方法,可以將分析副作用限制到應用程序的特定部分。
- 1. 爲什麼GetLogicalProcessorInformation()API不提供有關緩存內存的完整信息?
- 2. 查找有關CPU負載類型的更多信息
- 3. 有什麼方法提供進度信息的類
- 4. 爲什麼JPA沒有爲延遲加載關係提供loadChildren()方法?
- 5. 有沒有什麼方法可以從Coldfusion內部訪問有關Coldfusion服務器負載的信息?
- 6. 爲什麼CPU時間是負的
- 7. 爲什麼在提供數據有效載荷時沒有收到WM_COPYDATA消息?
- 8. element.innerHTML沒有提供完整的數據
- 9. 爲什麼Thread.Start方法在CPU負載過高時被阻塞?
- 10. 爲什麼Get-Member不提供所有屬性和方法的完整列表。
- 11. VisualVM「Sampler-> Cpu-> CpuSettings」灰顯。怎麼來的?
- 12. ImageView沒有提供完整的高度?
- 13. 的PHPUnit不提供有關跳過不完整的測試足夠的信息
- 14. 爲什麼android調試器不能提供有用的信息?
- 15. JUnit沒有提供關於「錯誤」的信息
- 16. 有沒有什麼方法檢查Objective-c提供的方法的時間複雜度?
- 17. 在Eclipse中有沒有一種方法可以確定什麼是CPU時間?
- 18. 爲什麼沒有DWARF信息?
- 19. 爲什麼setTimeout在預期的時間沒有執行?
- 20. 爲什麼Django沒有序列化完整的模型關係?
- 21. 爲什麼沒有沒有參數的IsNullOrEmpty重載方法?
- 22. 如何獲得有關JavaScript執行結束的一些異步方法的信息,不提供此選項
- 23. Firebird點網絡提供者沒有完全執行查詢?
- 24. 爲什麼關鍵路徑的權重提供了執行所有工作的總時間的下限?
- 25. 有沒有基於互信息的特徵提取方法?
- 26. 爲什麼代碼在沒有輸出相關時似乎沒有執行?
- 27. 我沒有得到,爲什麼不執行POST方法
- 28. Rxjava爲什麼沒有執行onNext方法
- 29. 爲什麼它沒有顯示所有的信息爲XML?
- 30. 爲什麼我的SQL沒有執行?
該鏈接已過期,現在無效。是否可以內聯該問題的示例? – ADTC