diff --git a/common/transport/mqtt/pom.xml b/common/transport/mqtt/pom.xml
index 676593804e..b6ceb13951 100644
--- a/common/transport/mqtt/pom.xml
+++ b/common/transport/mqtt/pom.xml
@@ -88,6 +88,11 @@
junit
test
+
+ org.awaitility
+ awaitility
+ test
+
org.mockito
mockito-core
diff --git a/common/transport/mqtt/src/test/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionHandlerTest.java b/common/transport/mqtt/src/test/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionHandlerTest.java
new file mode 100644
index 0000000000..c75f7b2a23
--- /dev/null
+++ b/common/transport/mqtt/src/test/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionHandlerTest.java
@@ -0,0 +1,46 @@
+package org.thingsboard.server.transport.mqtt.session;
+
+import org.junit.Test;
+
+import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import static org.awaitility.Awaitility.await;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.BDDMockito.willCallRealMethod;
+import static org.mockito.Mockito.mock;
+
+public class GatewaySessionHandlerTest {
+
+ @Test
+ public void givenWeakHashMap_WhenGC_thenMapIsEmpty() {
+ WeakHashMap map = new WeakHashMap<>();
+
+ String deviceName = new String("device"); //constants are static and doesn't affected by GC, so use new instead
+ map.put(deviceName, new ReentrantLock());
+ assertTrue(map.containsKey(deviceName));
+
+ deviceName = null;
+ System.gc();
+
+ await().atMost(10, TimeUnit.SECONDS).until(() -> !map.containsKey("device"));
+ }
+
+ @Test
+ public void givenConcurrentReferenceHashMap_WhenGC_thenMapIsEmpty() {
+ GatewaySessionHandler gsh = mock(GatewaySessionHandler.class);
+ willCallRealMethod().given(gsh).createWeakMap();
+
+ ConcurrentMap map = gsh.createWeakMap();
+ map.put("device", new ReentrantLock());
+ assertTrue(map.containsKey("device"));
+
+ System.gc();
+
+ await().atMost(10, TimeUnit.SECONDS).until(() -> !map.containsKey("device"));
+ }
+
+}
\ No newline at end of file