2장_아이템7 - ririkat/effective-java GitHub Wiki

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

📔 Summary

자바는 가비지 컬렉터가 메모리를 어느 정도 관리해줘 프로그래머 입장에서 직접 메모리 관리를 하지 않아도 되기 때문에 편리하다. 하지만, 이를 메모리 관리에 더 이상 신경 쓰지 않아도 된다고 오해하면 안된다. 자칫하면 메모리 누수에 노출될 수 있기 때문이다.

메모리 누수를 일으키는 주범

  • 객체의 참조 해제 미흡
  • 캐시
  • 리스너 or 콜백

메모리 누수를 막기 위한 해법

  • 객체의 참조 해제 미흡 참조 해제를 위해 무조건 null 처리할 필요는 없다. 가비지 컬렉터가 관리하는 대상의 경우에는 유효 범위 밖으로 밀어내는 것으로 충분하다.
    • 자기 메모리를 직접 관리하는 클래스의 경우
      • 참조를 다 썻을 때 null 처리 한다.
    • 그 외
      • 참조를 담은 변수를 유효 범위 밖으로 밀어낸다
  • 캐시
    • WeekHashMap 을 사용해 캐시를 만들어라

      캐시 외부에서 키를 참조하는 동안만 엔트리가 살아 있는 캐시가 필요한 상황일 경우에 사용하는 방법

    • 시간이 지날수록 엔트리의 가치를 떨어뜨려라 쓰지 않는 엔트리 청소 필요

      백그라운드 스레드 활용 캐시에 새 엔트리 추가 시 부수 작업 수행

  • 리스너 or 콜백
    • 약한 참조로 저장 -> 가비지 컬렉터가 수거

📔 Note

⚠️ **GitHub.com Fallback** ⚠️