2013-04-08 173 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选项定义了最小堆大小,因此如果它不是内存泄漏/开销问题,它应该解决您的问题。

如果您怀疑您的程序使用的内存比必要的多得多,那么有一些工具可用于跟踪内存使用情况。