[ 
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)

Reply via email to