티스토리 뷰
Reachability
GC는 reference의 강약에 따라 도달 가능한 객체를 제외하고
모두 쓰레기로 간주한다
GC의 관점에서는 객체를 참조가 가능한 객체와 참조할 수 없는 객체로 본다
즉, 내가 다시 사용할 수 있냐, 없냐를 보고
없으면 쓰레기통으로 넣어버리는 것이다
Reference Object는 참조의 강약에 따라
Strong Reference, SoftReference, WeakReference, Phantom Reference로 나누고
순서대로 참조가 강하다
* 하나의 객체가 Strong과 Weak 참조가 있다면 그 객체는
Strong한 객체로 생각한다
Strong Reference
Strong Reference는 new를 이용해 생성된 객체를 말한다
이 객체는 GC에서 무조건 제외되기 때문에 Memory Leak을 방지하기 위해서는
이 참조를 주의해서 보아야 한다
이 참조를 지워주지 않으면 GC에 의해 수거되지 않고 남아있기 때문에
메모리 누수를 유발할 수 있다
Soft Reference
Soft Reference는 다음과 같이 객체에 Reference를 넘겨줌으로써 생성할 수 있다
SoftReference object = new SoftReference(new Object());
이 참조는 메모리가 충분하다면 GC에 의해서 수거되지 않고,
메모리에 여유가 없다면 GC에 의해 수거된다
Weak Reference
Weak Reference는 SoftReference와 유사하지만 GC가 발생되기 전까지는 참조를 유지하고
GC가 발생하면 무조건 회수된다는 점에서 차이가 있다
이는 유용하게 쓰일 수 있는데, 짧은 시간, 자주 쓰일 수 있는 객체를 이용할 때 유용하게
사용될 수 있다
WeakReference wr;
public String getFileContent(String filename){
// WeakReference 에 의해 파일 내용이 보존되어 있는지 체크
String fileContent = (wr != null) ? wr.get() : null;
if(fileContent == null) {
// 글 내용이 비었으면 파일 이름으로 내용을 읽어와 채워준다
fileContent = fileToString(filename);
//채워진 글 내용을 WeakReference에 저장한다
wr = new WeakReference(fileContent);
}
return fileContent;
}
예시 코드를 설명하자면, GC가 발생하기 전까진
WeakReference가 글 내용을 가지고 있으면서 캐쉬 역할을 하지만
GC가 발생하면 wr.get()은 null을 반환하고
다시 채우는 부분을 실행함으로써
Memory Leak을 방지할 수 있는 것이다
WeakReference와 SoftReference의 차이점
둘의 가장 큰 차이점은 언제 GC가 되느냐이다
WeakReference의 경우는 strong reference 가 모두 끊기고 GC 타이밍이
되었을 때 바로 GC routine을 타게된다
반면 SoftReference는 최대한 GC routine을 늦게 탄다
즉, strong reference가 모두 끊겼다고해도, 메모리에 여유가 있으면
GC가 수행되지 않는 것이다
메모리에 여유가 없다는 것은 OutofMemoryError 직전을 이야기 한다
+ 참고
https://msdn.microsoft.com/ko-kr/library/system.weakreference(v=vs.110).aspx
'프로그래밍 > Android' 카테고리의 다른 글
[Android] RecyclerView 에서 DataBinding (0) | 2017.10.30 |
---|---|
[Android] Handler.handleMessage() 사용 (0) | 2017.10.29 |
[Android] This Handler class should be static or leaks might occur (0) | 2017.10.29 |
[Android] Adapter.notifyDataSetChanged() (0) | 2017.09.29 |
[Android] EditText 입력 변화 이벤트 addTextChangedListener (0) | 2017.09.28 |