본문 바로가기
프로그래밍 언어/Java

이펙티브 자바 - 아이템 7. 다 쓴 객체 참조를 해제하라

by 데브조이 2024. 9. 4.
반응형
이펙티브 자바(Effective java)를 읽고 정리한 글입니다. 

 

가비지 컬렉터를 가진 Java를 사용하더라도 메모리 관리에 신경 쓰지 않아도 되는 것은 아니다.  


메모리 누수와 참조 해제

 

가비지 컬렉션 언어에서는 메모리 누수를 찾기 매우 까다롭다 (의도치 않게 객체를 살려두는 경우). 

객체 참조 하나를 살려두면 그 객체가 참조하는 모든 객체를 회수하지 못한다. 

이는 잠재적으로 성능에 악영향을 줄 수 있다.

 

우리는 이 문제는 참조를 다쓴 객체를 null 처리하여 해결할 수 있다.

즉, 참조 해제를 통해 가능하다.

 

null 처리를 해두면, 실수로 해당 객체를 참조하려 할 때 NPE 가 발생한다.

이를 통해 오류를 조기에 발견할 수 있다.

하지만 모든 경우에 null 처리할 필요는 없다. 객체 참조를 null 처리 하는 일은 예외적인 경우여야 한다.  


NULL 처리가 필요한 경우

언제 null 처리를 해야 할까.

직접 메모리를 관리하는 경우, 가비지 컬렉터는 활성 영역과 비활성 영역을 구분할 수 없다

즉, 가비지 컬렉터는 비활성 영역에서 참조하는 객체도 유효한 객체로 본다.  

그렇기 때문에 개발자가 null 처리를 통해 가비지 컬렉터가 비활성 객체임을 알려야 한다.

 

1. 메모리를 직접 관리하는 경우

메모리를 직접 관리하는 클래스라면, 개발자는 메모리 누수에 주의해야 한다.  

원소를 다 사용했다면, null 처리하자.

 

2. 캐시

캐시도 마찬가지이다.

참고로 WeekHashMap을 사용해서 캐시를 만들면, 다 쓴 엔트리는 자동 제거 된다. 

 

캐시를 만들 때 엔트리의 유효 기간을 정의하기 어렵다.

백그라운드 스레드나 새 엔트리를 추가할 때 부수 작업을 수행하는 등 쓰지 않는 엔트리는 청소해줘야 한다.

ex. LinkedHashMap의 removeEldestEntry

 

3. 리스너(listener), 콜백(callback)

클라이언트가 콜백 등록만 하고 해지하지 않는다면, 사라지지 않는다.

이때, 콜백을 약한 참조로 저장하면 가비지 컬렉터가 수거해 간다. 


정리

메모리 누수는 발견하기 어렵다.

그렇기 때문에 예방법을 익히는 것이 중요하다. 

 

 

반응형