WeakHashMap의 작동 방식을 이해하려면 JVM의 GC와 관련하여 WeakReference를 조금을 이해 할 필요가 있다. Java에는 세 가지 주요 유형의 참조(Reference) 방식이 존재한다.
강한 참조 (Strong Reference)
Integer prime = 1; 와 같은 가장 일반적인 참조 유형이다.
해당 변수는 값이 1인 Integer 객체에 대한 강한 참조를 가진다. 이 객체를 가리키는 강한 참조가 있는 객체는 GC 대상이 되지 않는다.
부드러운 참조 (Soft Reference)
SoftReference soft = new SoftReference(prime);와 같이 SoftReference 클래스를 사용하여 생성이 가능하다.
만약 prime == null 상태가 되어 원본 객체는 없고 해당 대상을 참조하던 객체(Soft Reference)만 존재할 경우 GC 대상으로 들어가도록 JVM은 동작한다.
다만 WeakReference와의 차이점은 메모리가 부족하지 않으면 굳이 GC하지 않는다.
약한 참조 (Weak Reference)
WeakReference soft = new WeakReference(prime);와 같이 WeakReference 클래스를 사용하여 생성이 가능하다.
만약 prime == null 상태가 되어 원본 객체는 없고 해당 대상을 참조하던 객체(Soft Reference)만 존재할 경우 메모리가 부족하지 않더라도 GC 대상으로 들어가도록 JVM은 동작한다. 그 후 다음 GC가 발생하는 시점에 무조건 없어진다.
WeakHashMap
일반적인 HashMap의 경우 일단 Map안에 Key와 Value가 put되면 사용여부와 관계없이 해당 내용은 삭제되지 않는다.
만약 특정 Key에 해당하는 어떤 객체가 NULL이 되어도 해당 Entry는 그대로 Map에 남아 있는다.
WeakHashMap은 WeakReference의 특성을 이용하여 HashMap의 Element를 자동으로 제거, GC 해버린다. Key에 해당되는 객체가 더 이상 사용되지 않는다고 판단되면 해당 Entry를 제거한다는 의미이다.
public class WeakHashMapTest {
public static void main(String[] args) {
WeakHashMap<Integer, String> map = new WeakHashMap<>();
Integer key1 = 1000;
Integer key2 = 2000;
map.put(key1, "test a");
map.put(key2, "test b");
key1 = null;
System.gc(); //강제 Garbage Collection
map.entrySet()
.stream()
.forEach(
el -> System.out.println(el) //key2만 프린트된다.
);
}
}