[英]Detect root cause in heap dumps in java
在java堆轉儲中,我如何確切地知道代碼/哪個線程導致轉儲的位置?
用於讀取內存轉儲:
我建議你嘗試“eclipse內存分析器”從這里開始
另一個選項(免費)將使用JVisualVM打開它(可在$ JAVA_HOME / bin處獲得)jhat也很酷,但已經推薦:)
現在,您要問的是導致內存堆轉儲的線程,而不是關於如何繼續進行內存轉儲......這取決於您是如何獲取內存轉儲的。 有不同的方法來獲得轉儲。
在您的進程上,一旦遇到OutOfMemory錯誤,您可以指示JVM生成內存轉儲,在這種情況下,我相信它將是JVM本身。
您可以從MBean觸發堆轉儲創建,前提是您已運行JMX Server以及JVM 示例
您甚至可以在應用程序外部使用系統調用(在Linux上): kill -3 _YOUR_JAVA_PROCESS_ID_
將生成heapdump。
但我幾乎無法想象你為什么需要這樣的信息。 稍后在評論中你提到'確切的代碼行'但這些方法通常是你的JVM外部的......你確定需要一行代碼來生成堆轉儲本身,或者你試圖找出真正的問題嗎?
希望這可以幫助
在java中你創建了一些對象,在很多地方使用它,然后讓GC收回它。 沒有單行導致泄漏。
您應該在MAP等工具中查找的是對象計數和它們使用的堆。 選擇每個目標類,看看為什么它們不是垃圾收集的。 (有人拿着超過需要的參考 - 比如一個靜態場)
您可能會發現此頁面中的說明更有用 - http://scn.sap.com/people/krum.tsvetkov/blog/2007/07/02/finding-memory-leaks-with-sap-memory-analyzer (也鏈接)來自MAT主頁)
嘗試使用Java堆分析工具(jhat)或jconsole(位於JAVA_HOME \\ bin中)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.