반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

안드로이드 개발자 노트

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

Kotlin/이펙티브 코틀린

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

어리둥절범고래 2024. 1. 28. 14:57
반응형

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

https://d2.naver.com/helloworld/329631

반응형