2013-04-08 195 views
1

在最近的Java訪談中,我被問到了這個問題。 當我們得到一個OutOfMemory異常時,我們如何才能找出哪個類和哪個方法拋出了OutOfMemory異常。我回答說它會出現堆棧跟蹤,但他告訴我,很多時候它不會告訴你哪個特定的方法/類拋出了異常。我假設他期待可以提供幫助的一些工具或JVM參數。但我從來沒有用過它,所以我無法回答。OutofMemory異常詳細信息

我嘗試了一個簡單的例子,我將值放入一個無限循環的散列表中。過了一段時間,我得到一個OutOfMemory錯誤,它顯示了類/方法名稱和行號。我想了解什麼情況下它不會給你這些細節[method/classname]以及我可以用來找出它的工具/ VM參數。

**Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Unknown Source) 
    at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source) 
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source) 
    at java.lang.AbstractStringBuilder.append(Unknown Source) 
    at java.lang.StringBuilder.append(Unknown Source) 
    at hashmapTest.main(hashmapTest.java:18)** 

我也看到這個VM參數 Xms1024m -Xmx1024m -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath,但我不是很肯定,如果它是用來實現這一目的。

回答

0

如果Java堆空間不足,您可能會看到哪個特定對象拋出異常(如果它是您自己的對象之一),但它很可能是內部Java對象,它會執行一些低級別的延遲內部工作,在這種情況下,痕跡不是很有幫助。

Xms選項定義了允許的最大堆大小,Xms選項定義了最小堆大小,因此如果它不是內存泄漏/開銷問題,它應該解決您的問題。

如果您懷疑您的程序使用的內存比必要的多得多,那麼有一些工具可用於跟蹤內存使用情況。