티스토리 뷰

728x90
반응형



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

반응형
공지사항
최근에 올라온 글