가비지 컬렉터가 있지만, 메모리 관리에 신경을 써야한다.
public Object push(Object e){
ensureCapacity(); // 원소를 위한 공간 확보
elements[size++] = e;
}
public Object pop(){
return elements[--size];
}
스택을 위 코드처럼 구현한 경우, 메모리 누수에 유의해야 함
스택이 커졌다가 줄어들었을 때 스택에서 꺼내진 객체들을 가비지 컬렉터가 회수하지 않음
→ 쓰지 않는 객체가 존재한다는 사실을 gc가 알 방법이 없다!
public Object pop(){
Object result = elements[--size];
elements[size] = null;
return result;
}
캐시에 참조를 넣어두고 잊을 수 있음
캐시 외부에서 키를 참조하는 동안만 엔트리가 필요한 상황이라면 WeakHashMap 사용하자
→ 다 쓴 엔트리는 자동으로 제거됨
쓰지 않는 엔트리를 청소하기 위해 백그라운드 스레드를 활용하거나 캐시에 새 엔트리 추가 시 부수 작업으로 수행하는 방법도 있음