JAVA/Effective Java

객체의 생성과 삭제 - 규칙 6 유효기간이 지난 객체 참조는 페기하라.

반응형

Java GC 있어 C C++처럼 순수 메모리 관리를 해주지 않아도 돼서 메모리 관리를 대부분 하지 않는다.
 
그러나  이상 참조하지 않는 객체에 대해 reference 제거하지 않는 경우에는 어떠한 경우에도 메모리 누수가 발생되게 된다.
 
이런 reference  단순하게 null 처리를 해줌으로써 해제된 참조를 해제   있다.
 
Null 바꾸게 되면, GC 해당 객체를 해제할  있는 객체라 생각하고 
 
반환해버린다.
 
하지만 이런 객체참조를 null 처리하는 것은 규범이라기보다는 예외적인 조치가 되어야 한다.
 
그렇다면 이런 만기참조를 해결하는데 좋은 방법이 어떤 것인가?
 
가장 좋은 방법은 해당 참조가 보관된 변수가 유효범위(scope) 벗어나게 하는 것이다.
 
 
또한 
 
캐시(cache) 메모리 누수가 흔히 발생할  있는 장소이다.
 
그래서 그런 캐시관리는 WeakHashMap으로 하면 키가 참조가 없어지는 순간 가비지콜렉터를 통해 
 
키와 값이 쌍으로 사라진다.
 
 참조 Weak reference
Weak reference에 의해 참조된 객체는 garbage collection이 발생하기 전까지는 객체에 대한 참조를 유지하지만 일단 garbage collection이 발생하면 무조건 수거된다. Weak reference가 사라지는 조건은 garbage collection의 실행 주기와 일치하는 것이다. 이를 이용하면 짧은 시간 동안 자주 쓰일 수 있는 객체를 캐쉬할 때 유용하게 이용할 수 있다.
 
 
그리고 메모리 누수가 흔히 발견되는   곳은 리스너 등의 역호출 되는 콜백 함수이다.
 
콜백함수를 사용한 후에는  그것에 대한 reference 해제해야 한다.

출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙6 인용.



반응형