Reference를 알아보자.
Reference Object
우선 개념부터 알고가자.
Reachability
- GC에서는 reference의 강약에 따라 도달 가능한 객체를 제외하고 모두 쓰레기로 간주한다.
- GC의 관점에서는 객체를 참조가 가능한 객체와 참조할 수 없는 객체 2가지로 본다.
- 다시 사용 가능한지? 다시 사용 불가한지?
여기서 참조의 강약에 따라 Strong Reference, Soft Reference, Weak Reference, Phantom Reference ... 으로 나뉘고 순서대로 참조가 강하다.
하나의 객체가 Strong과 Weak 참조가 있다면 그 객체는 Strong한 객체로 여겨진다.
Strong Reference
- new를 사용해 생성된 객체! (Heap영역에 적재)
- 이 객체는 GC에서 무조건 제외되기에 메모리 누수를 방지하기 위해서는 이 참조를 주의해서 봐야 한다.
- 이 참조를 지워주지 않으면 GC에 의해 수거되지 않고 남아있기 때문에 메모리 누수 유발 가능하다.
Soft Reference
- 객체의 참조를 넘겨줌으로서 생성이 된다.
SoftReference object = new SoftReference(new Object());
- 이 참조는 메모리가 충분하다면 GC의 수거 대상이 되지 않고, 메모리에 여유가 없다면 GC에 의해 수거된다.
Weak Reference
- Soft Reference와 유사하지만 GC가 발생되기 전까지는 참조를 유지하고 GC가 발생하면 무조건 회수된다는 점에서 차이가 있다.
- 짧은 시간, 자주 쓰일 수 있는 객체를 이용 할 때 유용하게 사용이 된다.
- GC 발생 전까진 특정 객체가 캐쉬 역할처럼 할 수 있지만 GC가 발생할 경우, 해당 부분을 null로 만들고 다시 채움으로써 메모리 누수를 방지 할 수 있다.
활용 사례
WeakReference obj = new WeakReference(new Sample());
Sample ex = obj.get();
//필요 작업 수행
ex = null;
위의 참조별 종류를 읽었다면 obj객체가 어떤 참조인지 알 것이다.
Sample()을 전달 인자로 넘겨줘서 Weak Reference이지만, new로 생성되었기에 Strong Reference를 갖게 된다.
그래서 GC에 의한 제거 대상이 아니다!
그렇기에 필요 작업만 수행하고나서, ex=null 해줌으로써 Strong을 제거 해줌으로 인해 Weak 해짐으로써 GC의 수거 대상이 되어 OOM을 방지할 수 있다.
좋은 글 감사합니다 ^^