Memory leaks

2023. 7. 25. 11:28개발/Android

정적 필드에서 참조되는 개체

  • static field는 일반 instance 변수보다 수명이 더 길기때문
  • 개체가 정적 필드에 저장될 때 메모리 누수 발생 가능성이 있음.
  • 적절히 onDestroy등에 해제시켜줘야함

class MainActivity : AppCompatActivity() {
    companion object {
        private var instance: MainActivity? = null
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        instance = this
    }

//메모리 해제~ 
    override fun onDestroy() {
        super.onDestroy()
        instance = null
    }
}

Application Class Instances

  • 앱 수명 주기동안 객체에 대한 참조 보유 가능
  • 웬만하면 여기 뭐 하지마라

class MyApplication : Application() {
    private var mainActivity: MainActivity? = null

    fun setMainActivity(activity: MainActivity) {
        mainActivity = activity
    }

    fun getMainActivity(): MainActivity? {
        return mainActivity
    }
}

활성화된 스레드의 객체 참조

  • 상태가 LIVE이므로 GC 안됨. → 누수

class MyThread : Thread() {
    private val mainActivity: MainActivity? = MainActivity()

    override fun run() {
        // Perform work using mainActivity
    }
}

익명 및 내부 클래스의 암시적 참조

  • 주변 개체에 대한 암시적 참조가 있답니다~
  • 적절하게 해제 잘 해줍시다

class MainActivity : AppCompatActivity() {
    private var backgroundTask: BackgroundTask? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Start the background task
        backgroundTask = BackgroundTask()
        backgroundTask?.start()
    }

    override fun onDestroy() {
        super.onDestroy()
        
        // 적절히 해제해주세용
        backgroundTask?.stopThread()
        backgroundTask = null
    }

    private inner class BackgroundTask : Thread() {
        private var isRunning = true

        override fun run() {
            // Perform a long-running task, such as downloading data or processing files
            while (isRunning) {
                // Task execution
            }
        }

        fun stopThread() {
            //스레드 멈춘 후
            isRunning = false
            // Additional cleanup code if required
        }
    }
}

요딴식으로 진행되면 아래와 같은 문제가 있음.

  1. 메모리 누수 : 스레드가 MainActivity에 대한 참조 보유하고 있어서 activity종료되어도 GC작동 안 함
  1. MAIN 끝났는데 계속 스레드 실행하면 유효하지 않은 CONTEXT에 접근하려고 할 수 있음
  1. 서비스가 알고있는 상태와 실제 상태가 상이할 수 있음

Uploaded by N2T

'개발 > Android' 카테고리의 다른 글

Server Driven UI  (0) 2023.07.25
Using Room (With HILT)  (0) 2023.07.25
Data Store  (0) 2023.07.25
6 Design Patterns Every Android Developer Must Know  (0) 2023.05.03
알아두면 좋은 Kotlin extension  (0) 2023.05.03