DZone Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Snippets has posted 5883 posts at DZone. View Full User Profile

Est-ce Qu'un PropertyChangeListener Bien Implémenté Empêche Le Garbage Collector De Fonctionner

12.18.2008
| 4555 views |
  • submit to reddit
        Question bête, hein.
Mais comme je m'apprête à jouer massivement avec des <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/beans/PropertyChangeListener.html">PropertyChangeListener</a>, j'ai intérêt à avoir une réponse qui tienne la route.

Donc voilà un petit test parfait pour vérifier ça :
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;


public class TestPropertyChangeListenerMemory {

	private static class PropertyChangeSender {
		protected final transient PropertyChangeSupport support = new PropertyChangeSupport(
				this);
		private long index;

		/**
		 * @param listener
		 * @see java.beans.PropertyChangeSupport#addPropertyChangeListener(java.beans.PropertyChangeListener)
		 * @category delegate
		 */
		public void addPropertyChangeListener(PropertyChangeListener listener) {
			support.addPropertyChangeListener(listener);
		}

		public void setIndex(long index) {
			if (this.index != index) {
				long old = this.index;
				this.index = index;
				support.firePropertyChange("index", old, index);
			}
		}
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		PropertyChangeListener listener = new PropertyChangeListener() {
			private long previousValue = 10;
			public void propertyChange(PropertyChangeEvent evt) {
				Long value = (Long) evt.getNewValue();
				if (value > 10 && value / previousValue == 10) {
					System.out.println(value);
					previousValue = value;
				}
			}
			
		};
		long index = 0;
		while (true) {
			PropertyChangeSender sender = new PropertyChangeSender();
			sender.addPropertyChangeListener(listener);
			sender.setIndex(index++);
		}
	}
}

Vous pouvez le lancer avec java -Xms2M -Xmx2M, ça passe sans problème (et j'ai mis ces grosses valeurs uniquement parce que la JVM n'autorise pas moins).
D'ailleurs, la seule chose qui arrête ce bout de code, c'est l'explosion des longs (qui n'arrive certes pas tout de suite :-))