본문 바로가기
  • soobinhand의 기술 블로그
도서/이펙티브 자바 - Joshua Bloch

아이템 7 - 다 쓴 객체 참조를 해제하라.

by soobinhand 2022. 1. 27.
728x90

가비지 컬렉션을 사용한다고 해서 메모리 관리에 더 이상 신경 쓰지 않아도 되는 것은 절대 아니다.

가비지 컬렉션에서는 메모리 누수를 찾기가 아주 까다롭다.

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

이러면 악영향을 줄 수 있다.

 

해법은 간단하다.

해당 참조를 다 썼을 때, null 처리(참조 해제)하면 된다.

 

객체 참조를 null 처리하는 것은 예외적인 경우여야 한다.

 

프로그래머는 비활성 영역이 되는 순간 null 처리해서 해당 객체를 더는 쓰지 않을 것임을 가비지 컬렉터에 알려야 한다.

일반적으로 자기 메모리를 직접 관리하는 클래스라면 프로그래머는 항시 메모리 누수에 주의해야 한다.

 

캐시 역시 메모리 누수를 일으키는 주범이다.

객체 참조를 캐시에 넣고 나서, 이 사실을 잊은 채 그 객체를 다 쓴 뒤로도 한참을 그냥 놔두는 일을 자주 접할 수 있다.

WeakHashMap은 이러한 상황에서 유용하다.

 

핵심 정리

메모리 누수는 겉으로 드러나지 않아 시스템에 수년간 잠복하는 사례도 있다. 이런 누수는 철저한 코드 리뷰나 힙 프로파일어 같은 디버깅 도구를 동원해야만 발견되기도 한다. 그래서 이런 종류의 문제는 예방법을 익혀두는 것이 매우 중요하다.

 

관련 코드

 

GitHub - Soobinhand/effective_java: 이펙티브 자바

이펙티브 자바. Contribute to Soobinhand/effective_java development by creating an account on GitHub.

github.com

 

728x90

댓글