我在最近的一次 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 但我不太确定它是否用于实现此目的。