1

我在最近的一次 Java 采访中被问到这个问题。当我们得到 OutOfMemory Exception 时,我们如何找出哪个类和哪个方法抛出了 OutOfMemory Exception。我回答说它会出现在堆栈跟踪中,但他告诉我很多时候它不会告诉您哪个特定方法/类引发了该异常。我假设他期待一些可以提供帮助的工具或 JVM 参数。但是我从来没有使用过,所以我无法回答。

我尝试了一个简单的示例,我将值放入无限循环中的哈希图中。一段时间后,我收到了 OutOfMemory 错误,它确实显示了类/方法名称和行号。我想了解在哪些情况下它不会为您提供这些详细信息[方法/类名],以及我可以使用哪些工具/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 但我不太确定它是否用于实现此目的。

4

1 回答 1

0

如果 Java 堆空间不足,您可能会看到哪个特定对象抛出异常(如果它是您自己的对象之一),但它很可能是一个内部 Java 对象,它正在执行一些低级延迟的内部工作,其中如果跟踪不是很有帮助。

Xms 选项定义了允许的最大堆大小,而 Xms 选项定义了最小堆大小,因此如果不是内存泄漏/开销问题,它应该可以解决您的问题。

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

于 2013-04-08T09:56:06.810 回答