diff --git a/core-java/pom.xml b/core-java/pom.xml
index 85afee2968..5c91150941 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -154,6 +154,12 @@
${mockito.version}
test
+
+ com.jayway.awaitility
+ awaitility
+ ${avaitility.version}
+ test
+
commons-codec
@@ -371,6 +377,7 @@
1.10.19
6.10
3.6.1
+ 1.7.0
3.6.0
diff --git a/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java b/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java
new file mode 100644
index 0000000000..fbeb364ab6
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/weakhashmap/WeakHashMapTest.java
@@ -0,0 +1,48 @@
+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 WeakHashMapTest {
+
+ @Test
+ public void givenWeakHashMap_whenCacheValueThatHasNoReferenceToIt_GCShouldReclaimThatObject() {
+ //given
+ WeakHashMap map = new WeakHashMap<>();
+ BigImage bigImage = new BigImage("foo");
+ UniqueImageName imageName = new UniqueImageName("name_of_big_image");
+
+ map.put(imageName, bigImage);
+ assertTrue(map.containsKey(imageName));
+
+ //when big image is not in use anymore
+ imageName = null;
+ System.gc();
+
+ //then GC will finally reclaim that object
+ await().atMost(10, TimeUnit.SECONDS).until(map::isEmpty);
+ }
+
+
+ class BigImage {
+ public final String imageId;
+
+ BigImage(String imageId) {
+ this.imageId = imageId;
+ }
+ }
+
+ class UniqueImageName {
+ public final String imageName;
+
+ UniqueImageName(String imageName) {
+ this.imageName = imageName;
+ }
+ }
+}