toedter.com Board
The JCalendar and HTML sitemap community forum!
Please log in or register.
The date and time is now September 3, 2010, 02:32:17 PM
Home  Search  Help  Log in  Register  Members

New Post Post Reply
toedter.com Board :: JCalendar :: Feature Requests :: Better JDateChooser Memory Leak Approach  ::
Kris Kemper
Newbie
Image

I can help.
Posts: 1
Better JDateChooser Memory Leak Approach (August 14, 2008, 04:57:55 PM) quote  
Recently I discovered a memory leak coming from JDateChoosers in my application. It stems from the JDateChooser registering an inner ChangeListener with the MenuSelectionManager in the constructor.

I discovered that there is a cleanup() method, but that is a poor solution - using a WeakReference would allow the Garbage Collector to collect the ChangeListener when the JDateChooser is no longer used.

To be clear, the Memory Leak happens when the references occur like this:
quote:

Main -> JDialog -> JDateChooser -> SomeListener
                         |
                         ----> ChangeLisener

MenuSelectionManager -> ChangeListener -> JDateChooser -> SomeListener -> JDialog

This kind of circular reference happens when you create anonymous listeners that use code in the containing class.

Anyway, the solution is to create a WeakReference based Proxy for the ChangeListener:
quote:

package com.toedter.calendar;

import java.lang.ref.*;

import javax.swing.event.*;

public class WeakChangeListenerProxy implements ChangeListener {

    public WeakReference reference;

    public WeakChangeListenerProxy(ChangeListener listener) {
        this.reference = new WeakReference(listener);
    }

    public void stateChanged(ChangeEvent e) {
        ChangeListener actualListener = (ChangeListener)reference.get();
        if (actualListener != null) {
            actualListener.stateChanged(e);
        }
    }

}

In JDateChooser, you change the constructor like so:
quote:

// The following idea was originally provided by forum user
// podiatanapraia:
ChangeListener changeListener2 = new ChangeListener() {
    // Change listener body
};

changeListener = new WeakChangeListenerProxy(changeListener2);
MenuSelectionManager.defaultManager().addChangeListener(changeListener);

Also, to cleanup the dangling WeakChangeListenerProxy, you add a finalize() method to JDateChooser:
quote:

protected void finalize() throws Throwable {
    super.finalize();
    MenuSelectionManager.defaultManager().removeChangeListener(changeListener);
}




Kris Kemper
IP logged Status: logged off Profile Send YIM Website 
Order of replies: first reply last :: first reply first
tuler
Newbie
Image

JCalendar is great!
Posts: 3
RE: Better JDateChooser Memory Leak Approach (February 12, 2009, 02:41:21 PM) quote  
Also noted this leak.
Thanks for the fix.



IP logged Status: logged off Profile 
stever
Newbie
Image


Posts: 2
RE: Better JDateChooser Memory Leak Approach (July 19, 2010, 04:31:11 PM) quote  
This fix has still not been added apparently, in 1.3.3. We have just spent some time chasing memory leaks, finding that one fix is needed in our code to call cleanup(), then also we need this fix to use weak references.
Surely this is very serious if a lot of users are jumping through these same hoops? How many are quietly going elsewhere?

IP logged Status: logged off Profile 
New Post Post Reply

Software PBLang 4.67.16.a © 2002-2006 by Martin Senftleben & the PBLang-Team
Image