Open jaejlf opened 2 weeks ago
p.38 WeakHashMap을 사용해 캐시를 만들자.
String이 key인 WeakHashMap 캐시 만들 때 주의가 필요함.
new
를 통해 생성된 문자열 -> Heap 영역에 생성 = GC 대상 O문자열 리터럴
로 생성된 문자열 -> String Pool에 생성 (= JVM에 의해 강한 참조 유지) = GC 대상 X (메모리 릭 발생 가능)
WeakHashMap<String, Object> map1 = new WeakHashMap<>();
WeakHashMap<String, Object> map2 = new WeakHashMap<>();
// 1. map1 : 문자열 객체로 캐시 key 생성 String str1 = new String("문자열 객체 Key"); map1.put(str1, new Object());
// 2. map2 : 문자열 리터럴로 캐시 key 생성 String str2 = "문자열 리터럴 Key"; map2.put(str2, new Object());
// 3. 캐시(map) 사이즈 확인 System.out.println(map1.size()); // 출력 결과 : 1 System.out.println(map2.size()); // 출력 결과 : 1
// 4. 캐시 key의 참조 해제 str1 = null; str2 = null;
// 5. GC 수행 System.gc(); Thread.sleep(5000);
// 6. 캐시(map) 사이즈 확인 System.out.println(map1.size()); // 출력 결과 : 0 System.out.println(map2.size()); // 출력 결과 : 1 (문자열 리터럴로 key가 생성된 캐시는 삭제 안됨!)