activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Gregory Mostizky (JIRA)" <>
Subject [jira] Reopened: (AMQ-1790) Memory leak in broker - Temporary Queue related (fix proposal included)
Date Thu, 12 Jun 2008 10:18:00 GMT


Gregory Mostizky reopened AMQ-1790:

It turns that there is additional source of memory leak in the above scenario.

Class in it's dispose() method doesnt
dispose it's destinations when it's running in CacheTempDestinations=false mode (which is
default). I fixed the method and used the fixed version on overnight stress test and it so
far it seems ok.

The fix (I added the else part):

    protected final synchronized void dispose(ConnectionContext context,
            Destination dest) throws Exception {
        // add to cache
        if (this.doCacheTempDestinations) {
            cachedDestinations.put(new CachedDestination(dest
                    .getActiveMQDestination()), dest);
        } else {
            try {
            } catch (Exception e) {
                LOG.warn("Failed to dispose of " + dest, e);

> Memory leak in broker - Temporary Queue related (fix proposal included)
> -----------------------------------------------------------------------
>                 Key: AMQ-1790
>                 URL:
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: Broker
>    Affects Versions: 5.1.0
>         Environment: ActiveMQ broker 5.1 
> Spring based application with synchronous messages (temp queue based)
>            Reporter: Gregory Mostizky
>            Assignee: Rob Davies
>            Priority: Critical
>             Fix For: 5.2.0
> ActiveMQ broker leaks memory when using temp queues.
> This is critical for projects that use spring based synchronous messaging because each
message creates & destroys new temp queue,
> however because of the leak they are not completely cleaned up resulting in OutOfMemory
> First these are the classes that are leaked:
> org.apache.activemq.usage.MemoryUsage
> org.apache.activemq.usage.DefaultUsageCapacity
> Cause:
> is a base class for queues and by extension
> When TempQueue is created it will call BaseDestination constructor which will allocate
some memory usage and statistics objects.
> However, the cleanup operation is missing - when TempQueue is destroyed these resources
are not removed, and because these objects form a tree with the root being the root SystemUsage
object they are never deleted.
> Solution:
> BaseDestination should implement dispose() method - this method is already defined in
Destination interface but not implemented in BaseDestination.
> This method should cleanup all the resources allocated during it's creation. For example,
see Queue.dispose().

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

View raw message