我编写了一个使用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设置 但没有任何帮助。
答案 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);