public Object pop() {
if(size == 0) {
throw new EmptystackException();
}
// 반환만 하고 참조를 해제하지 않음
return elements[--size];
}
public Object pop() {
if(size == 0) {
throw new EmptystackException();
}
Object result = elements[--size];
elements[size] = null;
return result;
}
이점
하지만, 이 방법은 이상적이지 않다.
Stack 클래스는 왜 메모리 누수에 취약한 걸까?
캐시는 리소스를 디스크에서 로드하는 것은 비싸므로 자주 사용하는 리소스를 메모리에 두고 사용하고자 할 때 사용된다.
하지만 캐시에 올린 리소스를 참조하는 곳이 없는 경우, 리소스를 제거를 해야하는데, 강력한 참조를 사용하면 해당 참조 자체로 리소스에 메모리에 남아있게 된다.
GC가 리소스가 필요치 않아지는 시점을 판별하고 캐시에서 리소스를 제거 해야한다.
WeakHashMap
은 오래 사용되거나 사용되지 않늰다고 판단되는 객체를 GC
가 자동으로 제거한다.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));
}
}
결과
2000=test b
Process finished with exit code 0
null 로 할당된 key1 이 Map 내에서 제거되었다.
Map<String,Object> linkedMap = new LinkedHashMap<String,Object>() {
// 가장 오래된 값 삭제
@Ovrride
public boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return this.size() == MAX_ENTRIES ? true : false;
}
};