OutOfMemoryError:带有32位

时间:2017-06-19 09:55:58

标签: java websocket jetty 32bit-64bit bytebuffer

我编写了一个使用jetty websocket连接到websocket服务器的应用程序。当使用JDK 1.8.0(64位)时,一切似乎都很好但是当切换到JDK 1.8.0(32位)时,我收到以下错误:

java.lang.OutOfMemoryError: Direct buffer memory
   at java.nio.Bits.reserveMemory(Bits.java:693)
   at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
   at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
   at org.eclipse.jetty.util.BufferUtil.allocateDirect(BufferUtil.java:133)
   at org.eclipse.jetty.io.ByteBufferPool.newByteBuffer(ByteBufferPool.java:61)
at org.eclipse.jetty.io.MappedByteBufferPool.acquire(MappedByteBufferPool.java:67)
at org.eclipse.jetty.websocket.common.io.FrameFlusher$Flusher.batch(FrameFlusher.java:65)

我认为这与32位无法处理请求的字节缓冲区大小这一事实有关。

所以最简单的解决方案是切换到64位,但我们有很多客户使用32位系统:有没有更简单的解决方案?

我已经尝试使用各种参数更改JVM设置 但没有任何帮助。

1 个答案:

答案 0 :(得分:1)

我发现了这个问题:我设置了连接/连接的缓冲区太高,因为我也传输文件。我把它设置为1024 * 1024 * 1024,这意味着1GB。

我将其更改为50 MB(超过我的需要)并且可以正常工作。

session.getPolicy().setMaxBinaryMessageBufferSize(BUFFER_SIZE);
session.getPolicy().setMaxBinaryMessageSize(BUFFER_SIZE);
session.getPolicy().setMaxTextMessageBufferSize(BUFFER_SIZE);
session.getPolicy().setMaxTextMessageSize(BUFFER_SIZE);