2017-06-19 6 views
0

J'ai écrit une application qui se connecte à un serveur websocket en utilisant jetty websocket. Lorsque vous utilisez JDK 1.8.0 (64 bits) tout semble bien, mais lors du passage à 1.8.0 JDK (32 bits) Je reçois l'erreur suivante:OutOfMemoryError: mémoire tampon directe dans jetty websocket avec 32 bits

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) 

Je pense qu'il a à voir avec le fait que 32 bits ne peut pas gérer la taille de tampon d'octet demandée.

Donc la solution la plus simple serait de passer en 64 bits mais nous avons beaucoup de clients avec des systèmes 32 bits: y a-t-il une solution plus facile?

J'ai déjà essayé de changer les paramètres de la JVM avec divers paramètres mais rien n'a aidé.

Répondre

1

J'ai trouvé le problème: j'avais mis la Buffersize de la connexion/connexions trop haut parce que je transporte aussi des fichiers. Je l'ai mis à 1024 * 1024 * 1024, ce qui signifie 1Go. Je l'ai changé à 50 Mo (plus que j'ai besoin) et cela fonctionne.

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