package com.baeldung.weakhashmap; import org.junit.Test; import java.util.WeakHashMap; import java.util.concurrent.TimeUnit; import static com.jayway.awaitility.Awaitility.await; import static org.junit.Assert.assertTrue; public class WeakHashMapUnitTest { @Test public void givenWeakHashMap_whenCacheValueThatHasNoReferenceToIt_GCShouldReclaimThatObject() { //given WeakHashMap map = new WeakHashMap<>(); BigImage bigImage = new BigImage("image_id"); UniqueImageName imageName = new UniqueImageName("name_of_big_image"); map.put(imageName, bigImage); assertTrue(map.containsKey(imageName)); //when big image key is not reference anywhere imageName = null; System.gc(); //then GC will finally reclaim that object await().atMost(10, TimeUnit.SECONDS).until(map::isEmpty); } @Test public void givenWeakHashMap_whenCacheValueThatHasNoReferenceToIt_GCShouldReclaimThatObjectButLeaveReferencedObject() { //given WeakHashMap map = new WeakHashMap<>(); BigImage bigImageFirst = new BigImage("foo"); UniqueImageName imageNameFirst = new UniqueImageName("name_of_big_image"); BigImage bigImageSecond = new BigImage("foo_2"); UniqueImageName imageNameSecond = new UniqueImageName("name_of_big_image_2"); map.put(imageNameFirst, bigImageFirst); map.put(imageNameSecond, bigImageSecond); assertTrue(map.containsKey(imageNameFirst)); assertTrue(map.containsKey(imageNameSecond)); //when imageNameFirst = null; System.gc(); //then await().atMost(10, TimeUnit.SECONDS).until(() -> map.size() == 1); await().atMost(10, TimeUnit.SECONDS).until(() -> map.containsKey(imageNameSecond)); } class BigImage { public final String imageId; BigImage(String imageId) { this.imageId = imageId; } } class UniqueImageName { public final String imageName; UniqueImageName(String imageName) { this.imageName = imageName; } } }