정적 필드에서 참조되는 개체
- 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
}
}
}
요딴식으로 진행되면 아래와 같은 문제가 있음.
- 메모리 누수 : 스레드가 MainActivity에 대한 참조 보유하고 있어서 activity종료되어도 GC작동 안 함
- MAIN 끝났는데 계속 스레드 실행하면 유효하지 않은 CONTEXT에 접근하려고 할 수 있음
- 서비스가 알고있는 상태와 실제 상태가 상이할 수 있음
Uploaded by N2T