2017-06-19 69 views
0

我寫了一個應用程序連接到websocket服務器使用碼頭websocket。當使用JDK 1.8.0(64位),一切似乎正常,但當切換到JDK 1.8.0(32位),我收到以下錯誤:OutOfMemoryError:直接緩衝區內存在碼頭websocket與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

我發現了這個問題:我已經將連接/連接的緩衝區設置得太高,因爲我也傳輸文件。我將它設置爲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);