James Netherton created CAMEL-9195:
--------------------------------------
Summary: Memory leak in UndertowProducer
Key: CAMEL-9195
URL: https://issues.apache.org/jira/browse/CAMEL-9195
Project: Camel
Issue Type: Bug
Components: camel-undertow
Affects Versions: 2.16.0
Reporter: James Netherton
The UndertowProducer class leaks memory over time due to the repeated creation
of ByteBufferSlicePool for each HTTP client request. My understanding of this
class is that instances of it should be limited and cached if possible.
Here's an example RouteBuilder to replicate the issue. In a short time it will
result in an OutOfMemoryError.
{code}
public class UndertowRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
from("undertow:http://localhost:8080/test").to("log:undertow?showAll=true");
from("timer:foo?period=5000").transform(constant("hello
world")).to("undertow:http://localhost:8080/test");
}
}
{code}
{code}
org.apache.camel.CamelExecutionException: Exception occurred during execution
on the exchange: Exchange[ID-worklaptop-50317-1444141557043-2-30][Message:
hello world]
at
org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1658)
at
org.apache.camel.impl.DefaultExchange.setException(DefaultExchange.java:345)
at
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:156)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:460)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
at
org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:165)
at
org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:73)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Caused by: java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory(Bits.java:658)
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
at org.xnio.BufferAllocator$2.allocate(BufferAllocator.java:57)
at org.xnio.BufferAllocator$2.allocate(BufferAllocator.java:55)
at org.xnio.ByteBufferSlicePool.allocate(ByteBufferSlicePool.java:143)
at
io.undertow.client.http.HttpRequestConduit.processWrite(HttpRequestConduit.java:98)
at
io.undertow.client.http.HttpRequestConduit.write(HttpRequestConduit.java:460)
at
io.undertow.conduits.AbstractFixedLengthStreamSinkConduit.write(AbstractFixedLengthStreamSinkConduit.java:106)
at
org.xnio.conduits.ConduitStreamSinkChannel.write(ConduitStreamSinkChannel.java:150)
at
io.undertow.channels.DetachableStreamSinkChannel.write(DetachableStreamSinkChannel.java:240)
at
org.apache.camel.component.undertow.UndertowProducer$UndertowProducerCallback.completed(UndertowProducer.java:166)
at
org.apache.camel.component.undertow.UndertowProducer$UndertowProducerCallback.completed(UndertowProducer.java:121)
at
io.undertow.client.http.HttpClientExchange.invokeReadReadyCallback(HttpClientExchange.java:190)
at
io.undertow.client.http.HttpClientConnection.initiateRequest(HttpClientConnection.java:293)
at
io.undertow.client.http.HttpClientConnection.sendRequest(HttpClientConnection.java:228)
at
org.apache.camel.component.undertow.UndertowProducer.process(UndertowProducer.java:102)
at
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:141)
... 10 more
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)