]
Carlos Rodríguez Aguado commented on WFLY-4696:
-----------------------------------------------
Yesterday we modified the source code to free the buffer on BufferOverflowException. In a
few days we will know if the outofmemory is solved or not, or if exists other memoryleak.
We have been monitoring the problem with jvisualvm, trying to discover where is the
memoryleak, but the problem is that is a memory leak in native memory.
OutOfMemory DirectByteBuffer XNIO
---------------------------------
Key: WFLY-4696
URL:
https://issues.jboss.org/browse/WFLY-4696
Project: WildFly
Issue Type: Bug
Components: IO, Web (Undertow)
Affects Versions: 8.1.0.Final, 8.2.0.Final
Reporter: Carlos Rodríguez Aguado
Assignee: Stuart Douglas
Priority: Blocker
I get this errors constantly in my server when a web connection is interrupted from the
browser for instance:
11:50:45,301 ERROR [stderr] (default task-339) Exception in thread "default
task-339" java.nio.BufferOverflowException
11:50:45,301 ERROR [stderr] (default task-339) at
java.nio.DirectByteBuffer.put(DirectByteBuffer.java:363)
11:50:45,301 ERROR [stderr] (default task-339) at
java.nio.ByteBuffer.put(ByteBuffer.java:859)
11:50:45,301 ERROR [stderr] (default task-339) at
io.undertow.util.HttpString.appendTo(HttpString.java:204)
11:50:45,301 ERROR [stderr] (default task-339) at
io.undertow.server.protocol.http.HttpResponseConduit.processWrite(HttpResponseConduit.java:150)
11:50:45,301 ERROR [stderr] (default task-339) at
io.undertow.server.protocol.http.HttpResponseConduit.flush(HttpResponseConduit.java:629)
11:50:45,301 ERROR [stderr] (default task-339) at
io.undertow.conduits.AbstractFixedLengthStreamSinkConduit.flush(AbstractFixedLengthStreamSinkConduit.java:205)
11:50:45,301 ERROR [stderr] (default task-339) at
org.xnio.conduits.ConduitStreamSinkChannel.flush(ConduitStreamSinkChannel.java:162)
11:50:45,301 ERROR [stderr] (default task-339) at
io.undertow.channels.DetachableStreamSinkChannel.flush(DetachableStreamSinkChannel.java:100)
11:50:45,301 ERROR [stderr] (default task-339) at
io.undertow.server.HttpServerExchange.closeAndFlushResponse(HttpServerExchange.java:1489)
11:50:45,317 ERROR [stderr] (default task-339) at
io.undertow.server.HttpServerExchange.endExchange(HttpServerExchange.java:1470)
11:50:45,317 ERROR [stderr] (default task-339) at
io.undertow.server.Connectors.executeRootHandler(Connectors.java:201)
11:50:45,317 ERROR [stderr] (default task-339) at
io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:727)
11:50:45,317 ERROR [stderr] (default task-339) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
11:50:45,317 ERROR [stderr] (default task-339) at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
11:50:45,317 ERROR [stderr] (default task-339) at java.lang.Thread.run(Thread.java:745)
And then, I think this errors lead to a OutOfMemory crash:
14:23:09,592 ERROR [org.xnio.listener] (default I/O-3) XNIO001007: A channel event
listener threw an exception: java.lang.OutOfMemoryError
at sun.misc.Unsafe.allocateMemory(Native Method) [rt.jar:1.8.0_20]
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:127) [rt.jar:1.8.0_20]
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311) [rt.jar:1.8.0_20]
at org.xnio.BufferAllocator$2.allocate(BufferAllocator.java:57)
[xnio-api-3.2.2.Final.jar:3.2.2.Final]
at org.xnio.BufferAllocator$2.allocate(BufferAllocator.java:55)
[xnio-api-3.2.2.Final.jar:3.2.2.Final]
at org.xnio.ByteBufferSlicePool.allocate(ByteBufferSlicePool.java:149)
[xnio-api-3.2.2.Final.jar:3.2.2.Final]
at org.xnio.ssl.JsseSslConduitEngine.<init>(JsseSslConduitEngine.java:143)
[xnio-api-3.2.2.Final.jar:3.2.2.Final]
at org.xnio.ssl.JsseSslStreamConnection.<init>(JsseSslStreamConnection.java:71)
[xnio-api-3.2.2.Final.jar:3.2.2.Final]
at
org.xnio.ssl.JsseAcceptingSslStreamConnection.accept(JsseAcceptingSslStreamConnection.java:45)
[xnio-api-3.2.2.Final.jar:3.2.2.Final]
at
org.xnio.ssl.JsseAcceptingSslStreamConnection.accept(JsseAcceptingSslStreamConnection.java:37)
[xnio-api-3.2.2.Final.jar:3.2.2.Final]
at org.xnio.ssl.AbstractAcceptingSslChannel.accept(AbstractAcceptingSslChannel.java:187)
[xnio-api-3.2.2.Final.jar:3.2.2.Final]
at org.xnio.ChannelListeners$10.handleEvent(ChannelListeners.java:289)
[xnio-api-3.2.2.Final.jar:3.2.2.Final]
at org.xnio.ChannelListeners$10.handleEvent(ChannelListeners.java:286)
[xnio-api-3.2.2.Final.jar:3.2.2.Final]
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
[xnio-api-3.2.2.Final.jar:3.2.2.Final]
at
org.xnio.ChannelListeners$DelegatingChannelListener.handleEvent(ChannelListeners.java:1092)
[xnio-api-3.2.2.Final.jar:3.2.2.Final]
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
[xnio-api-3.2.2.Final.jar:3.2.2.Final]
at org.xnio.nio.NioTcpServerHandle.handleReady(NioTcpServerHandle.java:53)
[xnio-nio-3.2.2.Final.jar:3.2.2.Final]
at org.xnio.nio.WorkerThread.run(WorkerThread.java:539)
[xnio-nio-3.2.2.Final.jar:3.2.2.Final]
I also have found that if I perform a full GC manually the server recovers, but it can
not recover by itself, by performing other types of GCs.
This is the trace for version 8.2 of WildFly:
17:17:16,957 ERROR [io.undertow.request] (default task-49) Undertow request failed
HttpServerExchange{ GET /modulab/servlet/ShowPDFReportServlet}:
java.nio.BufferOverflowException
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:363) [rt.jar:1.8.0_20]
at java.nio.ByteBuffer.put(ByteBuffer.java:859) [rt.jar:1.8.0_20]
at io.undertow.util.HttpString.appendTo(HttpString.java:204)
at
io.undertow.server.protocol.http.HttpResponseConduit.processWrite(HttpResponseConduit.java:166)
at
io.undertow.server.protocol.http.HttpResponseConduit.write(HttpResponseConduit.java:564)
at
io.undertow.conduits.AbstractFixedLengthStreamSinkConduit.write(AbstractFixedLengthStreamSinkConduit.java:106)
at org.xnio.conduits.Conduits.writeFinalBasic(Conduits.java:132)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at
io.undertow.conduits.AbstractFixedLengthStreamSinkConduit.writeFinal(AbstractFixedLengthStreamSinkConduit.java:175)
at
org.xnio.conduits.ConduitStreamSinkChannel.writeFinal(ConduitStreamSinkChannel.java:104)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at
io.undertow.channels.DetachableStreamSinkChannel.writeFinal(DetachableStreamSinkChannel.java:194)
at
io.undertow.server.HttpServerExchange$WriteDispatchChannel.writeFinal(HttpServerExchange.java:1829)
at
io.undertow.servlet.spec.ServletOutputStreamImpl.writeBufferBlocking(ServletOutputStreamImpl.java:565)
at
io.undertow.servlet.spec.ServletOutputStreamImpl.close(ServletOutputStreamImpl.java:600)
at
io.undertow.servlet.spec.HttpServletResponseImpl.closeStreamAndWriter(HttpServletResponseImpl.java:497)
at
io.undertow.servlet.spec.HttpServletResponseImpl.responseDone(HttpServletResponseImpl.java:581)
at
io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:308)
at
io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247)
at
io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76)
at
io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:166)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:197)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[rt.jar:1.8.0_20]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[rt.jar:1.8.0_20]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_20]
10:57:12,389 ERROR [org.xnio.listener] (default I/O-4) XNIO001007: A channel event
listener threw an exception: java.lang.OutOfMemoryError
at sun.misc.Unsafe.allocateMemory(Native Method) [rt.jar:1.8.0_20]
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:127) [rt.jar:1.8.0_20]
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311) [rt.jar:1.8.0_20]
at org.xnio.BufferAllocator$2.allocate(BufferAllocator.java:57)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at org.xnio.BufferAllocator$2.allocate(BufferAllocator.java:55)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at org.xnio.ByteBufferSlicePool.allocate(ByteBufferSlicePool.java:143)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at org.xnio.ssl.JsseSslConduitEngine.<init>(JsseSslConduitEngine.java:146)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at org.xnio.ssl.JsseSslStreamConnection.<init>(JsseSslStreamConnection.java:71)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at
org.xnio.ssl.JsseAcceptingSslStreamConnection.accept(JsseAcceptingSslStreamConnection.java:45)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at
org.xnio.ssl.JsseAcceptingSslStreamConnection.accept(JsseAcceptingSslStreamConnection.java:37)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at org.xnio.ssl.AbstractAcceptingSslChannel.accept(AbstractAcceptingSslChannel.java:187)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at org.xnio.ChannelListeners$10.handleEvent(ChannelListeners.java:289)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at org.xnio.ChannelListeners$10.handleEvent(ChannelListeners.java:286)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at
org.xnio.ChannelListeners$DelegatingChannelListener.handleEvent(ChannelListeners.java:1092)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at org.xnio.ChannelListeners.invokeChannelListener(ChannelListeners.java:92)
[xnio-api-3.3.0.Final.jar:3.3.0.Final]
at org.xnio.nio.NioTcpServerHandle.handleReady(NioTcpServerHandle.java:53)
[xnio-nio-3.3.0.Final.jar:3.3.0.Final]
at org.xnio.nio.WorkerThread.run(WorkerThread.java:539)
[xnio-nio-3.3.0.Final.jar:3.3.0.Final]