The stack trace you quoted is irrelevant; it's just executors waiting to be
given work to do.  There are also lots of threads trying to read messages
from sockets in
org/apache/activemq/transport/tcp/TcpBufferedInputStream.fill() or waiting
for a message to be available during a call to
org/apache/activemq/SimplePriorityMessageDispatchChannel.dequeue(); both of
those are also irrelevant, because they're just ActiveMQ waiting to be
given work.

There are two threads waiting for responses to synchronous sends in
org/apache/activemq/ActiveMQConnection.syncSendPacket().  Those might
simply be victims of the inability to read messages, or they might be
relevant to what's going on; it's hard to tell from what you've sent.  One
thing I'd check based on them (and one thing I'd always check in general,
so hopefully you've already done this) is whether there are any errors in
the ActiveMQ broker logs, and specifically whether there are any messages
about producer flow control kicking in.  Depending on how PFC is
configured, I believe I've seen at least one JIRA or wiki page describing
the potential for PFC to cause deadlock when synchronous sends are used by
preventing the acks from being read.  If you see PFC-related lines in the
broker logs, we'll go from there; if not, then don't worry about this.

My overall thought, however, is that ActiveMQ (and the Spring JMS library
you're using) on its own isn't likely to run your client out of memory
unless your messages are VERY large, because there are limits on how many
messages will be transferred to your client at any one time.  Plus this
code has been run by LOTS of people over the years; if it caused OOMs on
its own, the cause would almost certainly have already been found.  So it's
most likely that this behavior is caused by something your own code is
doing, and the most likely guess is that you may be wrongly holding a
reference to objects that could otherwise be GCed, increasing heap memory
over time till you eventually run out.  You'll probably want to use tools
such as JVisualVM to analyze your memory usage and figure out what objects
are the ones causing it to grow and what's holding a reference to them.

One other possibility is that your algorithm is correct, but processing
each message is memory-intensive (using over half the heap in total across
however many messages you're processing in parallel) and so lots of objects
are getting forced into Old Gen even though they're actually short-lived
objects, and they are only getting removed from Old Gen via full GCs.  I
think this is far less likely than the other things I've described, but if
it's the problem, you could 1) increase the JVM's heap size if possible, 2)
tweak the percentages allocated to Old Gen and Young Gen to give more to
Young Gen in the hopes that more things will stay in Young Gen for longer,
or 3) look into other GC strategies (I'd recommend G1GC, but you appear to
be on the IBM JVM and I've never used it or researched it so I don't know
what GC strategies it offers).  But I think you'd really want to prove to
yourself that this is your problem (i.e. that none of the other things I've
mentioned are) before you go down this path, because throwing more memory
at a memory leak doesn't fix it, it just delays it and makes it harder to
troubleshoot.

Tim

On Fri, Jun 26, 2015 at 1:53 AM, cdelgado <carlos.delg...@proyecti.es>
wrote:

> Hi all,
>
> We're facing an issues that is stopping us for going to production, this is
> a huge blocker for us.
>
> The problem is that one of our consumers is hanging (randomly, aparently)
> and stops consuming messages. From a JMX we can see that is consuming
> memory
> and performing quite a lot full GCs.
>
> I'm attaching a javacore dump generated sending a kill -3 to the process.
> There you can see all the details and thread statuses.
>
> javacore.txt
> <http://activemq.2283324.n4.nabble.com/file/n4698204/javacore.txt>
>
> Basically, we have 90.7% of the threads waiting on condition, 3.5% Parked
> and 5.7% Running.
>
> The Parked threads have different stacktraces, but generally they end in
> the
> same block:
>
> *at sun/misc/Unsafe.park(Native Method)
> at
>
> java/util/concurrent/locks/LockSupport.parkNanos(LockSupport.java:222(Compiled
> Code))
> at
>
> java/util/concurrent/SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:435(Compiled
> Code)) *
> at
>
> java/util/concurrent/SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:334(Compiled
> Code))
> at
>
> java/util/concurrent/SynchronousQueue.poll(SynchronousQueue.java:885(Compiled
> Code))
> at
>
> java/util/concurrent/ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:966(Compiled
> Code))
> at
>
> java/util/concurrent/ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:928)
> at java/lang/Thread.run(Thread.java:761)
>
> Any *quick* help would be much appreciated, I'm a bit ost here.. :S
>
> Carlos
>
>
>
> --
> View this message in context:
> http://activemq.2283324.n4.nabble.com/JMS-Client-HANGING-AMQ-5-9-AIX-6-1-tp4698204.html
> Sent from the ActiveMQ - User mailing list archive at Nabble.com.
>

Reply via email to