- 자바는 가비지 컬렉터가 객체 해제와 관련된 모든 작업을 해주어서 개발자에게 편의성을 주지만
- 메모리 관리를 완전히 무시해 버리면, 메모리 누수가 발생할 수 있다.
- 따라서 더 이상 사용하지 않는 객체의 레퍼런스를 유지하면 안 된다 라는 규칙을 지켜주는게 중요
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
- 되도록 변수를 지역 스코프에 정의하고, 톱레벨 프로퍼티 또는 객체 선언으로 큰 데이터를 저장하지 않는 것도 중요
'Reading Record > 이펙티브 코틀린' 카테고리의 다른 글
[이펙티브 코틀린] Item 47. 인라인 클래스의 사용을 고려하라 (0) | 2022.06.13 |
---|---|
[이펙티브 코틀린] Item 46. 함수 타입 파라미터를 갖는 함수에 inline 한정자를 붙여라 (0) | 2022.06.12 |
[이펙티브 코틀린] Item 45. 불필요한 객체 생성을 피하라 (0) | 2022.06.12 |
[이펙티브 코틀린] Item 38. 연산 또는 액션을 전달할 때는 인터페이스 대신 함수 타입을 사용하라 (0) | 2022.06.07 |
[이펙티브 코틀린] Item 37. 데이터 집합 표현에 data 한정자를 사용하라 (0) | 2022.06.07 |