我正在使用simpleframework来实现一个HTTP服务器,除其他外,它处理大图像(4m到8m)。
我注意到一段时间后,应用程序抛出OutOfMemory异常并停止处理进一步的请求。 使用jconsole,我看到直接内存增加了,但它永远不会被释放。引发的异常是:
2014/08/27 17:30:28 | Exception in thread "Dispatcher: Thread-17" java.lang.OutOfMemoryError: Direct buffer memory
2014/08/27 17:30:28 | at java.nio.Bits.reserveMemory(Unknown Source)
2014/08/27 17:30:28 | at java.nio.DirectByteBuffer.<init>(Unknown Source)
2014/08/27 17:30:28 | at java.nio.ByteBuffer.allocateDirect(Unknown Source)
2014/08/27 17:30:28 | at sun.nio.ch.Util.getTemporaryDirectBuffer(Unknown Source)
2014/08/27 17:30:28 | at sun.nio.ch.IOUtil.write(Unknown Source)
2014/08/27 17:30:28 | at sun.nio.ch.SocketChannelImpl.write(Unknown Source)
2014/08/27 17:30:28 | at org.simpleframework.transport.BufferWrapper.write(BufferWrapper.java:356)
我尝试将直接内存大小(-XX:MaxDirectMemorySize)增加到800米,但它只延迟了OutOfMemory异常。
有人有这个问题吗?有什么办法可以解除分配这段记忆吗?
我在Windows Server 2003 x64盒子上使用最新版本的simpleframework(5.1.6)。
致以最诚挚的问候,
TelmoSimões
答案 0 :(得分:0)
您可能会在6.0版本中获得更好的运气。它尚未正式发布,但最终发布时API不太可能发生太大变化。此外,还对输出缓冲区的内存分配进行了重新设计。它还支持开箱即用的WebSockets。
答案 1 :(得分:-1)
OOM异常可能有很多原因。原因需要详细分析。堆转储会有所帮助。在OOM异常上为堆转储添加VM参数。还要尝试增加堆大小,然后再试一次。