Before 2022/Android

Weak Reference에 대해(메모리 누수)

Eljoe 2019. 1. 22. 15:35

GC는 참 유용하다.


메모리 신경 쓸 필요없이 원하는대로 코딩한 후 메모리가 부족하면 자기가 알아서 실행되어 메모리를 확보해준다.


하지만 GC가 메모리 부족하다고 몽땅 회수할 순 없는 노릇이다.


그래서 이 GC는 참조(Reference)를 회수의 관점으로 본다.


회수를 할려고 하는데 참조가 가능한가 아닌가를 두고 결정한다는 것이다.


이러한 참조의 정도를 크게 3단계로 나뉘는데, 아래와 같다.(PhantomReferece은 생략하겠다.)



WeakReference > SoftReference > StrongReferece 



StrongReference

- new Object(); 형태로 생성된 객체를 말하며, 해당 객체는 무조건 GC의 회수에서 제외된다.

메모리 누수가 일어나기 때문에 반드시 주의해서 보아야한다.


SoftReference

new SoftReference(new Object()); 형태로 생성된 객체를 말하며, 해당 객체는 메모리에 여유가 있다면 회수되지 않고

메모리가 부족한 상황이 발생했을 경우 회수된다.


WeakReference

new WeakReference(new Object()); 형태로 생성된 객체를 말하며, 해당 객체는 GC가 실행되기 전까진 유지되다,

GC가 실행되면 무조건 회수된다. 그러니까 언제든지 회수될 수 있는 객체란 의미이다.



WeakReference의 용도

다른 클래스에서 Activity를 포함한 객체를 참조하거나, 별도의 스레드에서 View, Activity등을 이용하고 있는 경우

해당 참조를 주어서 메모리 누수를 방지한다.


private WeakReference<Activity> reference;

Activity activity = reference.get();