더 이상 사용하지 않는 객체의 레퍼런스를 제거하라

자바는 가비지 컬렉터가 객체 해제와 관련된 모든 작업을 해주어서 개발자에게 편의성을 주지만

메모리 관리를 완전히 무시해 버리면, 메모리 누수가 발생할 수 있다.

따라서 더 이상 사용하지 않는 객체의 레퍼런스를 유지하면 안 된다 라는 규칙을 지켜주는게 중요

class MassObject {
    init {
        massObject = MassObject()
    }

    companion object {
        var massObject: MassObject? = null
    }
}

MassObject라는 클래스가 메모리를 많이 차지할 때 이렇게 companion으로 객체에 대한 참조를 유지하면, GC가 해당 객체에 대한 메모리 해제를 할 수 없다

이러한 리소스를 정적으로 유지하지 않는게 중요

또한 객체에 대한 레퍼런스를 다른 곳에 저장할 때는 메모리 누수가 발생할 가능성을 염두해야 한다

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

절대 사용되지 않는 객체를 캐시해서 저장해 두는 경우 메모리 누수가 발생할 수 있다

이런 경우 Soft Reference를 사용

SoftReference는 메모리가 필요할 경우 GC가 이를 알아서 해제

메모리가 부족하지 않아서 해제되지 않았다면 계속해서 활용 가능

화면 위의 대화상자와 같은 일부 객체

WeakReference를 사용

대화상자가 출력되는 동안에는 GC가 수집하지 않음

대화상자를 닫은 이후에는 GC가 수집

별도의 도구들을 이용해서 메모리 누수를 찾는 것도 좋은 방법

Heap Profiler

LeakCanary

되도록 변수를 지역 스코프에 정의하고, 톱레벨 프로퍼티 또는 객체 선언으로 큰 데이터를 저장하지 않는 것도 중요

Last updated