[
https://issues.apache.org/jira/browse/CAMEL-20486?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen updated CAMEL-20486:
--------------------------------
Priority: Minor (was: Major)
> JMS OutOfMemoryError in Streaming Mode
> --------------------------------------
>
> Key: CAMEL-20486
> URL: https://issues.apache.org/jira/browse/CAMEL-20486
> Project: Camel
> Issue Type: Bug
> Components: camel-jms
> Affects Versions: 3.22.0
> Environment: *Environment: Platform: MacOS, Camel 3.22.0, Spring
> Boot: v2.7.18, Java 17.0.5*
> Reporter: Michael Rambichler
> Priority: Minor
>
> We are struggling with big messages sent over jms in streaming fashion in
> production.
> *Expected:* Messages are transferred in streaming mode without the need of
> the equivalent amount of memory as the size of the file.
>
> *Currently: Java.lang.OutOfMemoryError: Java heap space*
> *Environment: Platform: MacOS, Camel 3.22.0*
> And started some analysis locally with the following outcome:
>
> We setup a simple route wich receives a message from jms.
> {code:java}
> from("jms:testjms_q?streamMessageTypeEnabled=true&artemisStreamingEnabled=true&jmsMessageType=Bytes")
> .log("Start streaming from jms")
> .to("stream:out")
> .log("Finished"); {code}
> For testing purpose we restricted the Java Heap Size to 700MB (-Xmx700m)
>
> After some analysis we see the
> {code:java}
> io.netty.util.internal.PlatformDependent.allocateUninitializedArray(int size)
> {
> return UNINITIALIZED_ARRAY_ALLOCATION_THRESHOLD < 0 ||
> UNINITIALIZED_ARRAY_ALLOCATION_THRESHOLD > size ?
> new byte[size] : PlatformDependent0.allocateUninitializedArray(size);
> }{code}
> Where size is equivalent with the message size awaiting in the JMS queue
> (around 1GB)
> Which of course lead to a OutOfMemoryError
> {code:java}
> /:: Spring Boot :: (v2.7.18)
> 2024-02-28 19:00:54.857 INFO 36343 --- [ main]
> org.example.MySpringBootApplication : Starting MySpringBootApplication
> using Java 17.0.5 on atca-052347 with PID 36343
> (/Users/at00191173/dev/src/playground/helloJms/target/classes started by
> at00191173 in /Users/at00191173/dev/src/playground/helloJms)2024-02-28
> 19:00:54.859 INFO 36343 --- [ main]
> org.example.MySpringBootApplication : No active profile set, falling
> back to 1 default profile: "default"2024-02-28 19:00:55.518 WARN 36343 --- [
> main] io.undertow.websockets.jsr : UT026010: Buffer
> pool was not set on WebSocketDeploymentInfo, the default pool will be
> used2024-02-28 19:00:55.528 INFO 36343 --- [ main]
> io.undertow.servlet : Initializing Spring embedded
> WebApplicationContext2024-02-28 19:00:55.528 INFO 36343 --- [
> main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext:
> initialization completed in 645 ms2024-02-28 19:00:56.079 DEBUG 36343 --- [
> main] i.netty.util.internal.PlatformDependent : sun.misc.Unsafe:
> available2024-02-28 19:00:56.080 DEBUG 36343 --- [ main]
> i.netty.util.internal.PlatformDependent : -Dio.netty.tmpdir:
> /var/folders/1j/85cl6ywn0tbg9tg4z_kbnhsr0000gr/T (java.io.tmpdir)2024-02-28
> 19:00:56.080 DEBUG 36343 --- [ main]
> i.netty.util.internal.PlatformDependent : -Dio.netty.bitMode: 64
> (sun.arch.data.model)2024-02-28 19:00:56.080 DEBUG 36343 --- [
> main] i.netty.util.internal.PlatformDependent : Platform: MacOS2024-02-28
> 19:00:56.080 DEBUG 36343 --- [ main]
> i.netty.util.internal.PlatformDependent : -Dio.netty.maxDirectMemory: -1
> bytes2024-02-28 19:00:56.080 DEBUG 36343 --- [ main]
> i.netty.util.internal.PlatformDependent :
> -Dio.netty.uninitializedArrayAllocationThreshold: -12024-02-28 19:00:56.081
> DEBUG 36343 --- [ main] i.netty.util.internal.PlatformDependent :
> -Dio.netty.noPreferDirect: false2024-02-28 19:00:56.181 INFO 36343 --- [
> main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s)
> beneath base path '/actuator'2024-02-28 19:00:56.227 INFO 36343 --- [
> main] io.undertow : starting server: Undertow
> - 2.2.28.Final2024-02-28 19:00:56.231 INFO 36343 --- [ main]
> org.xnio : XNIO version 3.8.7.Final2024-02-28
> 19:00:56.236 INFO 36343 --- [ main] org.xnio.nio
> : XNIO NIO Implementation Version 3.8.7.Final2024-02-28
> 19:00:56.256 INFO 36343 --- [ main] org.jboss.threads
> : JBoss Threads version 3.1.0.Final2024-02-28 19:00:56.276 INFO
> 36343 --- [ main] o.s.b.w.e.undertow.UndertowWebServer :
> Undertow started on port(s) 8080 (http)2024-02-28 19:00:56.398 DEBUG 36343
> --- [ main] o.a.camel.component.jms.JmsEndpoint : Using
> destinationName: testjms_q on listenerContainer:
> org.apache.camel.component.jms.DefaultJmsMessageListenerContainer@68454ed52024-02-28
> 19:00:56.400 INFO 36343 --- [ main]
> o.a.c.impl.engine.AbstractCamelContext : Apache Camel 3.22.0 (MyCamel) is
> starting2024-02-28 19:00:56.404 INFO 36343 --- [ main]
> o.a.c.i.e.DefaultStreamCachingStrategy : StreamCaching in use with spool
> directory: /Users/at00191173/temp and rules: [Spool > 9K body size]2024-02-28
> 19:00:56.408 TRACE 36343 --- [ main]
> o.a.camel.component.jms.JmsConsumer : Starting listener container
> org.apache.camel.component.jms.DefaultJmsMessageListenerContainer@68454ed5 on
> destination testjms_q2024-02-28 19:00:56.481 DEBUG 36343 --- [
> main] i.netty.util.internal.PlatformDependent :
> org.jctools-core.MpscChunkedArrayQueue: available2024-02-28 19:00:56.585
> DEBUG 36343 --- [ main] c.c.j.DefaultJmsMessageListenerContainer :
> Established shared JMS Connection2024-02-28 19:00:56.586 DEBUG 36343 --- [
> main] c.c.j.DefaultJmsMessageListenerContainer : Resumed paused task:
> org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker@5bf523e32024-02-28
> 19:00:56.586 DEBUG 36343 --- [ main]
> o.a.camel.component.jms.JmsConsumer : Started listener container
> org.apache.camel.component.jms.DefaultJmsMessageListenerContainer@68454ed5 on
> destination testjms_q2024-02-28 19:00:56.586 TRACE 36343 ---
> [umer[testjms_q]] c.c.j.DefaultJmsMessageListenerContainer : runningAllowed()
> -> true2024-02-28 19:00:56.587 INFO 36343 --- [ main]
> o.a.c.impl.engine.AbstractCamelContext : Routes startup
> (started:1)2024-02-28 19:00:56.587 INFO 36343 --- [ main]
> o.a.c.impl.engine.AbstractCamelContext : Started route1
> (jms://testjms_q)2024-02-28 19:00:56.587 INFO 36343 --- [ main]
> o.a.c.impl.engine.AbstractCamelContext : Apache Camel 3.22.0 (MyCamel)
> started in 296ms (build:18ms init:92ms start:186ms)2024-02-28 19:00:56.592
> INFO 36343 --- [ main] org.example.MySpringBootApplication :
> Started MySpringBootApplication in 1.906 seconds (JVM running for
> 2.423)2024-02-28 19:00:57.061 INFO 36343 --- [(3)-10.84.6.176]
> io.undertow.servlet : Initializing Spring
> DispatcherServlet 'dispatcherServlet'2024-02-28 19:00:57.062 INFO 36343 ---
> [(3)-10.84.6.176] o.s.web.servlet.DispatcherServlet : Initializing
> Servlet 'dispatcherServlet'2024-02-28 19:00:57.063 INFO 36343 ---
> [(3)-10.84.6.176] o.s.web.servlet.DispatcherServlet : Completed
> initialization in 1 ms2024-02-28 19:01:01.682 WARN 36343 ---
> [umer[testjms_q]] c.c.j.DefaultJmsMessageListenerContainer : Setup of JMS
> message listener invoker failed for destination 'testjms_q' - trying to
> recover. Cause: Java heap space
> java.lang.OutOfMemoryError: Java heap space at
> io.netty.util.internal.PlatformDependent.allocateUninitializedArray(PlatformDependent.java:323)
> ~[netty-common-4.1.101.Final.jar:4.1.101.Final] at
> io.netty.buffer.UnpooledUnsafeHeapByteBuf.allocateArray(UnpooledUnsafeHeapByteBuf.java:39)
> ~[netty-buffer-4.1.101.Final.jar:4.1.101.Final] at
> io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf.allocateArray(UnpooledByteBufAllocator.java:144)
> ~[netty-buffer-4.1.101.Final.jar:4.1.101.Final] at
> io.netty.buffer.UnpooledHeapByteBuf.<init>(UnpooledHeapByteBuf.java:59)
> ~[netty-buffer-4.1.101.Final.jar:4.1.101.Final] at
> io.netty.buffer.UnpooledUnsafeHeapByteBuf.<init>(UnpooledUnsafeHeapByteBuf.java:34)
> ~[netty-buffer-4.1.101.Final.jar:4.1.101.Final] at
> io.netty.buffer.UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf.<init>(UnpooledByteBufAllocator.java:139)
> ~[netty-buffer-4.1.101.Final.jar:4.1.101.Final] at
> io.netty.buffer.UnpooledByteBufAllocator.newHeapBuffer(UnpooledByteBufAllocator.java:82)
> ~[netty-buffer-4.1.101.Final.jar:4.1.101.Final] at
> io.netty.buffer.AbstractByteBufAllocator.heapBuffer(AbstractByteBufAllocator.java:169)
> ~[netty-buffer-4.1.101.Final.jar:4.1.101.Final] at
> io.netty.buffer.AbstractByteBufAllocator.heapBuffer(AbstractByteBufAllocator.java:160)
> ~[netty-buffer-4.1.101.Final.jar:4.1.101.Final] at
> io.netty.buffer.Unpooled.buffer(Unpooled.java:119)
> ~[netty-buffer-4.1.101.Final.jar:4.1.101.Final] at
> org.apache.activemq.artemis.core.message.impl.CoreMessage.initBuffer(CoreMessage.java:150)
> ~[artemis-core-client-2.19.1.jar:2.19.1] at
> org.apache.activemq.artemis.core.client.impl.ClientLargeMessageImpl.checkBuffer(ClientLargeMessageImpl.java:153)
> ~[artemis-core-client-2.19.1.jar:2.19.1] at
> org.apache.activemq.artemis.core.client.impl.ClientLargeMessageImpl.checkCompletion(ClientLargeMessageImpl.java:82)
> ~[artemis-core-client-2.19.1.jar:2.19.1] at
> org.apache.activemq.artemis.jms.client.ActiveMQMessage.doBeforeReceive(ActiveMQMessage.java:799)
> ~[artemis-jms-client-2.19.1.jar:2.19.1] at
> org.apache.activemq.artemis.jms.client.ActiveMQMessageConsumer.getMessage(ActiveMQMessageConsumer.java:230)
> ~[artemis-jms-client-2.19.1.jar:2.19.1] at
> org.apache.activemq.artemis.jms.client.ActiveMQMessageConsumer.receive(ActiveMQMessageConsumer.java:134)
> ~[artemis-jms-client-2.19.1.jar:2.19.1] at
> org.springframework.jms.support.destination.JmsDestinationAccessor.receiveFromConsumer(JmsDestinationAccessor.java:132)
> ~[spring-jms-5.3.31.jar:5.3.31] at
> org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:431)
> ~[spring-jms-5.3.31.jar:5.3.31] at
> org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:316)
> ~[spring-jms-5.3.31.jar:5.3.31] at
> org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:270)
> ~[spring-jms-5.3.31.jar:5.3.31] at
> org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1237)
> ~[spring-jms-5.3.31.jar:5.3.31] at
> org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1227)
> ~[spring-jms-5.3.31.jar:5.3.31] at
> org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1120)
> ~[spring-jms-5.3.31.jar:5.3.31] at
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
> ~[na:na] at
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
> ~[na:na] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)