package cyrille.lang.ref; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; /** * @author <a href="mailto:cleclerc@pobox.com">Cyrille Le Clerc</a> */ public class TestReferences { public static void main(String[] args) { try { TestReferences testReferences = new TestReferences(); for (int i = 4; i < 15; i++) { // testReferences.testSoftReference(i); testReferences.testSoftReferenceWithReferenceQueue(i); } for (int i = 0; i < 10; i++) { testReferences.testWeakReference(i); } } catch (Exception e) { e.printStackTrace(); } } public void testSoftReference(int factor) throws Exception { final int MAX = 1000; System.gc(); long freeMemoryBefore = Runtime.getRuntime().freeMemory(); Reference[] softReferences = new Reference[MAX]; for (int i = 0; i < softReferences.length; i++) { ReferencedObject referencedObject = new ReferencedObject(); referencedObject.setLastName("" + i); referencedObject.setData(new byte[factor * 1024]); softReferences[i] = new SoftReference(referencedObject); } long freeMemoryAfter = Runtime.getRuntime().freeMemory(); System.gc(); long freeMemoryAfterGc = Runtime.getRuntime().freeMemory(); int nullsCount = 0; int nonNullsCount = 0; for (Reference reference : softReferences) { ReferencedObject referencedObject = (ReferencedObject) reference.get(); if (referencedObject == null) { nullsCount += 1; } else { nonNullsCount += 1; } } System.out.println("SOFT Factor '" + factor + "'\tNulls '" + nullsCount + "' nonNulls '" + nonNullsCount + "' " + freeMemoryBefore + "-" + freeMemoryAfter + "-" + freeMemoryAfterGc); } public void testSoftReferenceWithReferenceQueue(int factor) throws Exception { ReferenceQueue referenceQueue = new ReferenceQueue(); final int MAX = 1000; System.gc(); long freeMemoryBefore = Runtime.getRuntime().freeMemory(); Reference[] softReferences = new Reference[MAX]; for (int i = 0; i < softReferences.length; i++) { ReferencedObject referencedObject = new ReferencedObject(); referencedObject.setLastName("" + i); referencedObject.setData(new byte[factor * 1024]); softReferences[i] = new SoftReference(referencedObject, referenceQueue); } long freeMemoryAfter = Runtime.getRuntime().freeMemory(); System.gc(); long freeMemoryAfterGc = Runtime.getRuntime().freeMemory(); int nullsCount = 0; int nonNullsCount = 0; for (Reference reference : softReferences) { ReferencedObject referencedObject = (ReferencedObject) reference.get(); if (referencedObject == null) { nullsCount += 1; } else { nonNullsCount += 1; } } int polledReferences = 0; Reference reference; while ((reference = referenceQueue.poll()) != null) { reference.get(); polledReferences++; } System.out.println("SOFT Factor '" + factor + "\tNulls '" + nullsCount + " nonNulls '" + nonNullsCount + "' polledReferences '" + polledReferences + "' \tfreeMemoryBefore '" + freeMemoryBefore + "'- freeMemoryAfter '" + freeMemoryAfter + "' - freeMemoryAfterGc '" + freeMemoryAfterGc + "'"); } public void testWeakReference(int factor) throws Exception { final int MAX = 1000; System.gc(); long freeMemoryBefore = Runtime.getRuntime().freeMemory(); Reference[] softReferences = new Reference[MAX]; for (int i = 0; i < softReferences.length; i++) { ReferencedObject referencedObject = new ReferencedObject(); referencedObject.setLastName("" + i); referencedObject.setData(new byte[factor * 1024]); softReferences[i] = new WeakReference(referencedObject); } long freeMemoryAfter = Runtime.getRuntime().freeMemory(); System.gc(); long freeMemoryAfterGc = Runtime.getRuntime().freeMemory(); int nullsCount = 0; int nonNullsCount = 0; for (Reference element : softReferences) { ReferencedObject referencedObject = (ReferencedObject) element.get(); if (referencedObject == null) { nullsCount += 1; } else { nonNullsCount += 1; } } System.out.println("WEAK Factor '" + factor + "\tNulls '" + nullsCount + " nonNulls '" + nonNullsCount + "' " + freeMemoryBefore + "-" + freeMemoryAfter + "-" + freeMemoryAfterGc); } }