안드로이드 개발자 노트
[이펙티브 코틀린] Item48. 더 이상 사용하지 않는 객체의 레퍼런스를 제거하라 본문
반응형
JVM의 GC가 메모리 관리를 해준다고 메모리 관리를 완전히 무시한다면, 메모리 누수가 발생하여 상황에 따라 OutOfMemoryError(OOME)가 발생할 수 있습니다.
안드로이드를 처음 시작하는 많은 개발자가 흔히 하는 실수로, 객체에 대한 참조를 companion 프로퍼티에 할당해 두는 경우가 있습니다.
이 경우, 가비지 컬렉터가 해당 객체에 대한 메모리 해제를 할 수 없으므로 메모리 누수가 발생합니다.
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//...
// this에 대한 레퍼런스 누수 발생
logError = { Log.e(this::class.simpleName, it.message)}
}
//...
companion object {
var logError: ((Throwable) -> Unit)? = null
}
}
이를 개선하는 방법으로 두 가지가 있습니다.
- 의존 관계를 정적으로 저장하지 않고, 다른 방법을 활용해서 적절하게 메모리 관리를 해야 한다.
- 객체에 대한 레퍼런스를 다른 곳에 저장할 때는 메모리 누수가 발생할 가능성을 염두해 두어야 한다.
그럼에도 메모리 누수가 발생한다면, 간단하게 객체를 더 이상 사용하지 않을 때 그 레퍼런스에 null을 설정하게 구현을 수정하면 됩니다.
레퍼런스가 null로 설정되면 가비지 컬렉터가 이를 처리하게 됩니다.
특히, 많은 변수를 캡처할 수 있는 함수 타입, Any 또는 제네릭 타입과 같은 미지의 클래스는 null을 설정하는 처리가 중요합니다.
OOME를 해결하는 방법으로, 소프트 레퍼런스(Soft Reference)와 약한 레퍼런스(Weak Reference)를 사용하는 것이 있습니다.
- SoftReference: 어떤 객체를 SoftReference로 연결하면, 메모리 부족 시 객체를 수거해간다. 또한, 객체의 사용 빈도에 따라 GC 여부가 결정된다.
- WeakReference: 어떤 객체를 WeakReference로 연결하면, 가비지 컬렉터가 동작할 때 해당 객체를 반드시 수거해간다.
**Java Reference와 GC
반응형
'Kotlin > 이펙티브 코틀린' 카테고리의 다른 글
[이펙티브 코틀린] Item49. 하나 이상의 처리 단계를 가진 경우에는 시퀀스를 사용하라 (1) | 2024.02.03 |
---|---|
[이펙티브 코틀린] Item47. 인라인 클래스의 사용을 고려하라 (0) | 2024.01.21 |
[이펙티브 코틀린] Item46. 함수 타입 파라미터를 갖는 함수에 inline 한정자를 붙여라 (0) | 2024.01.21 |