앞선 포스팅 (3. memory leak 회피방법: Inner Class Reference를 주의하라)
과 원리는 동일하다.
Class에서 익명 class를 만들게되면 익명클래스의 instance는 outer class의 instance에 대해서
reference를 가지게 된다.
상황 1. 참고싸이트에서 해결방법 요약
(https://android.jlelse.eu/9-ways-to-avoid-memory-leaks-in-android-b6d81648e35e)
익명클래스로 선언하고 outer class의 context를 static inner class instance로 넘김.
static inner class는 outer class의 instance를 가지지만 WeakReference로 가지기 때문에
스레드에서 긴작업을 하는도중 outer class의 instance가 해제되면, GC에 의해 잘 수거가 이루어지게 되고
WeakReference.get()을 하게되면 null값 반환후 종료되게된다.
상황2.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class Outer{
public void sampleMethod () {
SampleThread st = new SampleThread();
}
private static class SampleThread extends Thread {
public void run() {
Object sampleObject = new Object();
// ...
}
}
}
|
s |
위의 예제는 올바르다고 볼수있는가? => 그렇다.
Main thread (GC Root)는 Outer와 Static inner class를 따로 참조하고있으며
Outer와 static inner class간에는 서로 참조관계가 없다.
아래의 예제는 올바르다고 볼수있는가? => 아니다.
static inner class를 사용했지만 익명객체를 선언하게 되면서 (New Runnable...)
Runnable 객체가 Outer Class의 instance를 가지게 되고, SampleThread(static inner class)
익명의 Runnable 을 받게되어버리면 다시 Outer class의 intance를 reference하기에 문제가 생기게된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public class Outer{
public void sampleMethod () {
SampleThread st = new SampleThread(new Runnable() {
public void run () {
Object sampleObject = new Object();
// ...
}
});
}
private static class SampleThread extends Thread {
public SampleThread(Runnable runnable) {
super(runnable);
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
Outer가 일을 끝내서 소멸되려고 하는찰나에, 익명의 runable이 실행시간이 길게된다면 이는 outer class의 reference를 계속 잡고있기에 outer class의 memory leak이 발생하게된다.
참고
https://android.jlelse.eu/9-ways-to-avoid-memory-leaks-in-android-b6d81648e35e
'안드로이드 > Memory Leak' 카테고리의 다른 글
6. memory leak 회피방법: AsyncTask Reference 에서 주의 (0) | 2019.08.15 |
---|---|
5. memory leak 회피방법: Broadcast 에서 주의 (0) | 2019.08.15 |
3. memory leak 회피방법: Inner Class Reference를 주의하라 (0) | 2019.08.11 |
non static inner class를 memory 해제를 할 순 없을까? (1) | 2019.08.11 |
Static inner class를 쓰는이유는 무엇일까? (0) | 2019.08.11 |