코틀린 & Java

[Android] 가비지 컬렉터(Garbage Collector), 참조(Reference)에 대해 알아보자

코딩하는후운 2022. 9. 21. 10:18
반응형

[Android] 가비지 컬렉터(Garbage Collector), 참조(Reference)에 대해 알아보자

# Java의 Garbage Collector

1. 힙(heap) 내의 객체 중에서 가비지(garbage)를 찾아낸다.

2. 찾아낸 가비지를 처리해서 힙의 메모리를 회수한다.

 

# GC와 Reachability

- Java GC는 객체가 Garbage인지 판별하기 위해서 Reachability라는 개념을 사용

- 어떤 객체에 유효한 참조가 있으면 'reachable', 없으면 'unreachable'

- unreachable 객체를 가비지로 간주해 GC를 수행

- 유효한 최초의 참조가 있어야 하는데 이를 객체 참조의 root set

# Reference

- java.lang.ref는 Strong reference, Soft reference, Weak reference, Phantom reference를 클래스 형태로 제공

- SoftReference, WeakReference, PhantomReference 3가지 클래스에 의해 생성된 객체를 "Reference object"라고 부름

- reference object에 의해 참조된 객체는 "Referent"라고 부름

- WeakReference 클래스가 객체를 생성하는 예이다.

WeakReference<Sample> wr = new WeakReference<Sample>(new Sample());
Sample ex = wr.get();
...
ex = null;

위 코드의 마지막 줄에서 ex참조에 null을 대입하면 처음 생성한 Sample 객체는 오직 WeakReference 내부에서만 참조된다.

이 상태의 객체를 weakly rechable 객체라고 한다.

이 경우 Sample object가 weakly reachable 객체

 

# Reference와 Rechability

- Reference를 이용하여 Rechability를 지정하고 메모리를 회수할 수 있다.

 

# Reference 종류

  • 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로 만들고 다시 채움으로써 메모리 누수를 방지 할 수 있다.

 

# Softly Rechable과 SoftReference

  • softly rechable 객체의 GC를 조절하기 위해 다음 JVM 옵션을 제공한다.
  • 옵션의 기본값은 1000
-XX:SoftRefLRUPolicyMSPerMB=<N>
  • softly rechable 객체의 GC여부는 위 옵션의 설정한 숫자에 따라 다음 수식에 의해 결정된다.
(마지막 strong reference가 GC된 때로부터 지금까지의 시간) > (옵션 설정값 N) * (힙에 남아있는 메모리 크기)
  • 옵션 설정값이 1000이고 남아 있는 메모리가 100MB이면, 수식의 우변은 1,000ms/MB * 100MB = 100,000ms = 100sec, 즉 100초가 된다.
    • 따라서 softly rechable 객체가 100초 이상 사용되지 않으면 GC에 의해 회수 대상이 된다.

 

# ReferenceQueue

  • SoftReference와 WeakReference는 ReferenceQueue를 인자로 받는 생성자를 사용할 수 있다.
  • SoftReference 객체나 WeakReference 객체가 참조하는 객체가 GC대상이 되면 SoftReference 객체,
    WeakReference 객체 내의 참조는 null로 설정되고 SoftReference 객체, WeakReferecne 객체 자체는 ReferenceQueue에 enqueue된다.
  • ReferenceQueue에 enque하는 작업은 GC에 의해 수행
  • ReferenceQueue의 poll() 메서드나 remove() 메서드를 이용해 ReferenceQueue에 이들 reference object가 enqueue되었는지 확인하면 softly rechable 객체나 weakly rechable 객체가 GC되었는지를 파악할 수 있고, 이에 따라 관련된 리소스나 객체에 대한 후처리 작업을 할 수 있다.

 

참조:

https://d2.naver.com/helloworld/329631

스터디 그룹

반응형