我在最近的一次Java采访中被问到这个问题。 当我们得到OutOfMemory Exception时,我们如何找出抛出OutOfMemory Exception的类和方法。我回答说它会进入堆栈跟踪,但他告诉我很多次它不会告诉你哪个特定的方法/类抛出了异常。我认为他期待一些可以提供帮助的工具或JVM参数。但我从未使用过它,所以我无法回答。
我尝试了一个简单的例子,我将值放在一个无限循环的hashmap中。一段时间后,我得到一个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 :(得分:0)
如果Java的堆空间不足,您可能会看到哪个特定对象抛出异常(如果它是您自己的对象之一),但它很可能是内部Java对象,它正在执行一些低级延迟的内部工作,在这种情况下跟踪不是很有帮助。
Xms选项定义允许的最大堆大小,Xms选项定义最小堆大小,因此如果它不是内存泄漏/开销问题,它应该解决您的问题。
如果您怀疑程序使用的内存多于必要的内存,那么可以使用一些工具来跟踪内存使用情况。