HI everyone.  First of all, thanks for the great application, it works for me
very well now that I've figured my problem.  It took me a while, so here's
hoping this nugget finds someone else who might be fighting the same thing
someday.  The problem is specific to me and the size of my messages.It was
very easy for me to get working, I've migrated from two previous message
services and still maintain those connections while also publishing to
activemq.My set up is quite simple.  Non durable topicsjava publisher
application publishes to one or more non durable topicsa different java
subscriber subscribes to one or more non durable topics.Using
DUPS_OK_ACKNOWLEDGE policy when I create my session.Everything worked great
until about 2 hours into it:2016-05-20 13:27:04,757 | WARN  | Transport
Connection to: tcp://xxx.xxx.xxx.xxx:43932 failed: java.io.IOException:
Unexpected error occurred: java.lang.OutOfMemoryError: Java heap space |
org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ
Transport: tcp:///xxxx.xxx.xxxx.xxxx:43932@61616I searched high and low,
followed every example, played with GC settings, opened up the memory (just
made it last longer till it died), searched the ends of the earth and
incorporated all the fixes I could find.Finally I found a hint in a Redhat
forum.  When you use DUPS_OK_ACKNOWLEDGE, your messages aren't ACKED away
until about 50% to 65% of your PREFETCH POLICY are received. (ActiveMQ is
50%). When you use a non durable topic, default PREFETCH POLICY is SHORT -1
(32727)!  This may be great for small number of topics and small message
sizes.  My messages are averaging about 200K each, and when you stack 16K of
them up on multiple topics, ouch! :).I tried putting the jms.prefetchPolicy
into the transport in activemq.xml, but I probably did it wrong as it didn't
change may actual prefetch policy when I looked at the topic from jmx, it
was still default.So, I implemented it in my client and voila.  It works
perfectly now.ActiveMQConnectionFactory topicConnectionFactory                  
         
= new ActiveMQConnectionFactory(                                                
                          username,                                             
                         
password,                                                                       
 
"tcp://"+hostname+":"+port);ActiveMQPrefetchPolicy prefetchPolicy = new
ActiveMQPrefetchPolicy();prefetchPolicy.setTopicPrefetch(500);topicConnectionFactory.setPrefetchPolicy(prefetchPolicy);topicConnectionFactory.setTrustAllPackages(true);topicConnection
=
topicConnectionFactory.createTopicConnection();topicConnection.start();session
=
topicConnection.createTopicSession(false,Session.DUPS_OK_ACKNOWLEDGE);Thanks
all, hope that helps.  It was a riddle wrapped in a how do I fix this!



--
View this message in context: 
http://activemq.2283324.n4.nabble.com/OutOfMemoryException-a-solution-tp4712395.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.

Reply via email to