Over a million developers have joined DZone.

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

·
Question bête, hein.
Mais comme je m'apprête à jouer massivement avec des PropertyChangeListener, 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 :-))
Topics:

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}