You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@activemq.apache.org by "Georgi Danov (JIRA)" <ji...@apache.org> on 2014/05/27 16:46:03 UTC

[jira] [Commented] (AMQ-4977) Memory leak in ConnectionStateTracker when browsing non-empty queues

    [ https://issues.apache.org/jira/browse/AMQ-4977?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14009724#comment-14009724 ] 

Georgi Danov commented on AMQ-4977:
-----------------------------------

I desperately need update when is any of the 5.9.1 or 5.10 releases going out.
We will be upgrading from 5.6 and I want to avoid patching the client jar again

> Memory leak in ConnectionStateTracker when browsing non-empty queues
> --------------------------------------------------------------------
>
>                 Key: AMQ-4977
>                 URL: https://issues.apache.org/jira/browse/AMQ-4977
>             Project: ActiveMQ
>          Issue Type: Bug
>    Affects Versions: 5.6.0, 5.7.0, 5.8.0, 5.9.0
>            Reporter: Georgi Danov
>            Assignee: Timothy Bish
>             Fix For: 5.9.1, 5.10.0
>
>         Attachments: ConnectionStateTrackerMemoryLeakTest.java
>
>
> I think I found case that is not handled by the fix AMQ-3316. We see memory leaks connected to this bug and after good amount of headbanging I think the problem is in how two methods work together - processMessagePull and trackBack. The first one has this piece of code:
> {code}
>   // leave a single instance in the cache
>             final String id = pull.getDestination() + "::" + pull.getConsumerId();
>             messageCache.put(id.intern(), pull);
> {code}
> while the second one unconditionally increases the currentCacheSize - regardless if the previous method added or replaced entry in the cache.
> The situation where entries will be replaced (and not added) and the currentCacheSize will grow very fast until it wraps around and becomes negative is the following:
> * have some logic that frequently creates queue browser and iterates through all the entries
> * have the queue most of the time with at least one message. The more messages in the queue the faster currentCacheSize grows.
> The reason is that processMessagePull reuses the consumer and destination ID for each browsed message in the queue when org.apache.activemq.ActiveMQQueueBrowser#hasMoreElements is invoked. trackBack is ignorant of this and keeps adding to the size regardless that the cache size stays the same.
> Here is log from reproducing the issue as a proof:
> {code}
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 10000, 5 elements, pending scans:10, memory: 8951KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 20000, 10 elements, pending scans:10, memory: 10845KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 30000, 15 elements, pending scans:10, memory: 12645KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 40000, 20 elements, pending scans:10, memory: 10363KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 50000, 25 elements, pending scans:10, memory: 12169KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 60000, 30 elements, pending scans:10, memory: 9852KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 70000, 35 elements, pending scans:10, memory: 11657KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 80000, 40 elements, pending scans:10, memory: 9401KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 90000, 45 elements, pending scans:10, memory: 11222KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 100000, 50 elements, pending scans:10, memory: 13047KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 110000, 55 elements, pending scans:10, memory: 10767KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 120000, 60 elements, pending scans:10, memory: 12567KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 130000, 65 elements, pending scans:10, memory: 10256KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 138800, 67 elements, pending scans:10, memory: 12085KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 146800, 67 elements, pending scans:10, memory: 9745KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 154800, 67 elements, pending scans:10, memory: 11566KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 162800, 67 elements, pending scans:10, memory: 9225KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 170800, 67 elements, pending scans:10, memory: 11013KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 178800, 67 elements, pending scans:10, memory: 12812KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 186800, 67 elements, pending scans:10, memory: 10522KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 194800, 67 elements, pending scans:10, memory: 12328KB
> 2014-01-16 23:05:14  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 202800, 67 elements, pending scans:10, memory: 9999KB
> 2014-01-16 23:05:15  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 210800, 67 elements, pending scans:10, memory: 11805KB
> 2014-01-16 23:05:15  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 218800, 67 elements, pending scans:10, memory: 9496KB
> 2014-01-16 23:05:15  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 226800, 67 elements, pending scans:10, memory: 11316KB
> 2014-01-16 23:05:15  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 234800, 67 elements, pending scans:10, memory: 13100KB
> 2014-01-16 23:05:15  WARN ActiveMqMemoryLeakTest - MaxCacheSize: 131072, currentCacheSize: 242800, 67 elements, pending scans:10, memory: 10754KB
> {code}
> One can see that the garbage collection works well (cache does not grow) but the currentCacheSize keeps increasing
> Unfortunately I cannot easily extract the original code and provide it. Hope the explanation is clear enough. 



--
This message was sent by Atlassian JIRA
(v6.2#6252)