我在生产应用程序中遇到了一个奇怪的问题。我已经检查了服务器上的堆空间,但未发现任何异常(请参见下面的屏幕),但是我的应用程序执行的一些操作仍然出现以下错误。可能吗?

java - Java堆未满,但仍出现错误java.lang.OutOfMemoryError:Java堆空间-LMLPHP

java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2271)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1876)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1785)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1188)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)


我怀疑这个问题是代码中的列表之一,它将立即被几乎200万条记录填充,但是仍然不确定为什么会发生这种情况,因为堆没有显示完整或最大程度地使用,但是仍然得到了这个错误。可能吗?有什么可能的方案,有没有办法防止这种情况。这是生产应用程序,因此我将无法共享代码。请帮帮我。

最佳答案

抛出OutOfMemoryError不必一定要满。它必须处于当前大小加上下一个请求分配的大小超过最大值的情况。在这里,您显然正在复制一个足够大的数组,分配该数组会触发(已触发)此情况。

关于java - Java堆未满,但仍出现错误java.lang.OutOfMemoryError:Java堆空间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37863138/

10-09 04:09