본문 바로가기

Reading Record/이펙티브 코틀린

[이펙티브 코틀린] Item 48. 더 이상 사용하지 않는 객체의 레퍼런스를 제거하라

  • 자바는 가비지 컬렉터가 객체 해제와 관련된 모든 작업을 해주어서 개발자에게 편의성을 주지만
  • 메모리 관리를 완전히 무시해 버리면, 메모리 누수가 발생할 수 있다.
  • 따라서 더 이상 사용하지 않는 객체의 레퍼런스를 유지하면 안 된다 라는 규칙을 지켜주는게 중요
class MassObject {
    init {
        massObject = MassObject()
    }

    companion object {
        var massObject: MassObject? = null
    }
}
  • MassObject라는 클래스가 메모리를 많이 차지할 때 이렇게 companion으로 객체에 대한 참조를 유지하면, GC가 해당 객체에 대한 메모리 해제를 할 수 없다
  • 이러한 리소스를 정적으로 유지하지 않는게 중요
  • 또한 객체에 대한 레퍼런스를 다른 곳에 저장할 때는 메모리 누수가 발생할 가능성을 염두해야 한다

lazy delegate의 구현부

  • kotlin의 lazy delegate 는 사용 후 initializer를 null 로 초기화하여 메모리를 해제한다.

 

  • 절대 사용되지 않는 객체를 캐시해서 저장해 두는 경우 메모리 누수가 발생할 수 있다
    • 이런 경우 Soft Reference를 사용
    • SoftReference는 메모리가 필요할 경우 GC가 이를 알아서 해제
    • 메모리가 부족하지 않아서 해제되지 않았다면 계속해서 활용 가능
  • 화면 위의 대화상자와 같은 일부 객체
    • WeakReference를 사용
    • 대화상자가 출력되는 동안에는 GC가 수집하지 않음
    • 대화상자를 닫은 이후에는 GC가 수집
  • 별도의 도구들을 이용해서 메모리 누수를 찾는 것도 좋은 방법
    • Heap Profiler
    • LeakCanary
  • 되도록 변수를 지역 스코프에 정의하고, 톱레벨 프로퍼티 또는 객체 선언으로 큰 데이터를 저장하지 않는 것도 중요