簡體   English   中英

在java中檢測堆轉儲中的根本原因

[英]Detect root cause in heap dumps in java

在java堆轉儲中,我如何確切地知道代碼/哪個線程導致轉儲的位置?

用於讀取內存轉儲:

我建議你嘗試“eclipse內存分析器”從這里開始

另一個選項(免費)將使用JVisualVM打開它(可在$ JAVA_HOME / bin處獲得)jhat也很酷,但已經推薦:)

現在,您要問的是導致內存堆轉儲的線程,而不是關於如何繼續進行內存轉儲......這取決於您是如何獲取內存轉儲的。 有不同的方法來獲得轉儲。

  1. 在您的進程上,一旦遇到OutOfMemory錯誤,您可以指示JVM生成內存轉儲,在這種情況下,我相信它將是JVM本身。

  2. 您可以從MBean觸發堆轉儲創建,前提是您已運行JMX Server以及JVM 示例

  3. 您甚至可以在應用程序外部使用系統調用(在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM