Michael Rambichler created CAMEL-20486:
------------------------------------------

             Summary: 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


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