2013-10-30 42 views
1

GCViewer模式有任何教程嗎?我有一個GC日誌圖形如此形成的問題,但無法弄清楚它是一個內存泄漏問題還是僅僅需要更多的內存。任何人都可以請幫我嗎?GCViewer模式分析

從日誌中,它顯示錯誤「錯誤 - java.lang.OutOfMemoryError:超出GC開銷限制」 謝謝。

enter image description here

回答

1

爲了弄清楚是否有內存泄漏,具有GC圖表是不夠的。 基本上有兩種策略:

  1. 內存泄漏檢測: 一個很好的工具是使用Oracle JRockit Mission Control。它是內存泄漏檢測器,允許您計算特定類的實例數量。通過將您的內存檢測器連接到正在運行的JVM,您可以監控該數字如何更改超時。你應該看看是否有內存泄漏。顯示這些數字的工具示例可在http://docs.oracle.com/cd/E11035_01/jrockit/intro/wwimages/memleak3.gif找到。
  2. 堆轉儲分析:一個常用的工具是eclipse中的MAT。它是基於Eclipse的應用程序,用於分析JVM的堆轉儲。您可以隨時使用作爲JDK一部分提供的jmap進行堆轉儲。或者,您也可以等待JVM在發生OOM時轉儲文件。 通過分析堆轉儲,MAT應該給你一個合理的懷疑是什麼泄漏。您還可以清楚地看到創建了多少個對象(應用程序類或庫類)以及它們之間的關係。從這張圖片以及您對應用程序行爲的知識中,您應該能夠找出應用程序的哪個部分出錯。

一般來說,第一種方法對於開發人員和管理員來說都更容易和更直觀。第二個需要更多關於JVM和堆的知識。此外,由於JRockit Mission Control在生產JVM中的開銷較低,因此第一個可用於生產系統。

+0

謝謝。你知道在哪種情況下會發生內存激增?例如,在上圖中,內存突然激增並持續4分鐘,然後崩潰(內存級別恢復正常)。 – James

+0

程序加載或創建多個對象或一些非常大的對象的可能性相當大。例如。發出SQL查詢並嘗試一次將行作爲對象提取,而不進行分頁。另一個例子是處理一個非常大的對象,或者一個有很多被引用對象的對象。一個突出的例子是一個非常大的XML文檔作爲內存中的DOM對象讀入。 –