2012년 9월 14일 금요일

android memory 관리 WeakReference ,SoftReference



WeakReference 는

말 그대로 '약한' 참조이다. 
어떤 객체에 대한 참조가 WeakReference 밖에 남아있지 않다면 그 객체는 GC의 대상이 된다.



SoftReference 는

WeakReference 보다는 약간 강한 참조이다. SoftReference 역시 어떤 객체에 대한 참조가 SoftReference 만 남아있다면 GC의 대상이 되지만 메모리의 남은 공간이 넉넉하다면 GC되지 않을 것이다. 하지만 메모리에 남은 공간이 얼마 없다면 똑같이 GC의 대상이 된다.


WeakReference  용어그대로 약한 레퍼런스이다. 메모리관리를 위해 고안된것으로 레퍼런스를
WeakReference로 하면 gc에 해당 레퍼런스가 관여되지 않는다.
private WeakReference<Launcher> mLauncher; // 변수선언
void setLauncher(Launcher launcher) {
    mLauncher = new WeakReference<Launcher>(launcher); // 참조를 WeakReference로 저장함.

}
if (mLauncher != null) {

    final Launcher launcher = mLauncher.get(); // 사용시에는 get을 호출하여 null을 반드시 체크하여 사용

        if (launcher != null) {

            launcher.loadWallpaper();

        }

    }

SoftReference
 WeakReference 보다는 약간 강한 참조이다. Soft reference 만 남아있는 객체는 메모리의 요청에 의한 gc 의 대상이 된다. 메모리의 남은 공간이 넉넉하다면 gc되지 않을 것이며, 메모리의 남은 공간이 얼마 없거나 하다면 gc 의 대상이 될 것이다. 

확실한건 vm 이 OutOfMemoryError 를 발생시키기 전에는 Soft reference 만 남아있는 객체가 gc의 대상이 된다는 점 정도고, 그 이외에는 vm 의 구현에 따라 다를 수 있다.
Tags:



Java 에는 참 좋은 API들이 많이 있는 것 같다.

단, 몰라서 못쓰고 있는 것 뿐이지... 공부해야지.


아래 설명한 SoftReference 가 바로 그 것 인데... SoftReference와 WeakReference는 사용법과 기능이 거의 유사하다. 


결론적으로 차이점부터 말하자면 SoftReference가 WeakReference보다 조금 더 
GC(Garbage Collection)에 대해 강력하다는 것.






참고로, 강제로 GC시키는 방법은
System.gc();


잘 활용하면 정말 유용한 API 로 사용할 수 있을 것 같다.


출처 : http://liehacker.dyndns.org/blog/?p=1017
http://cuteelfluv.cafe24.com/xe/etc/11848

댓글 없음:

댓글 쓰기