가비지 컬렉션(Garbage Collection)

Ena JJJ·2022년 11월 3일
0

java

목록 보기
2/7

Garbage Collection(GC)는 JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역을 주기적으로 삭제하는 프로세스를 의미한다.

단점

  1. 개발자가 메모리가 언제 해제되는지 정확하게 알 수 없다.
  2. 가비지 컬렉션(GC)이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생한다.

객체들은 실질적으로 Heap 영역에서 생성되고 Method Area나 Stack Area등 Root Area에서는 Heap Area에 생성된 객체의 주소만 참조하는 형식으로 구성된다. 하지만 이렇게 생성된 Heap Area의 객체들이 메서드가 끝나는 등의 특정 이벤트들로 인하여 Heap Area 객체의 메모리 주소를 가지고 있는 참조 변수가 삭제되는 현상이 발생하면 위의 그림에서의 빨간색 객체와 같이 Heap영역 어디에서도 참조하지 않는 객체가 발생하며, 이러한 객체들을 Unreachable하다고 하며 주기적으로 GC가 제거해줍니다.

== Reachable : 객체가 참조되고 있는 상태
== Unreachable : 객체가 참조되고 있지 않은 상태 (GC의 대상이 됨)

Mark And Sweep 알고리즘

Mark And Sweep 알고리즘은 가비지 컬렉션이 동작하는 원리로 루트에서부터 해당 객체에 접근 가능한지에 대한 여부를 메모리 해제의 기준으로 삼습니다. Mark And Sweep은 위의 그림과 같이 총 3가지 과정으로 나뉘게 됩니다.

GC의 대상이 되는 Heap 영역


Heap Area는 효율적인 GC를 위해 위와 같이 Eden, Survival, Old Generation으로 나뉩니다.

GarbageCollention 동작

객체가 처음 생성되고 Eden 영역에 age-bit 0 으로 할당
age-bit은 Minor GC에서 살아남을 때마다 1씩 증가한다.


시간이 지나 Heap Area의 Eden 영역에 객체가 다 쌓이게 되면 Minor GC가 한번 일어나게 되고 참조 정도에 따라 Servivor() 영역으로 이동하거나 회수됩니다.

계속해서 Eden 영역에는 신규 객체들이 생성된다. 이렇게 또 Eden 영역에 객체가 다 쌓이게 되면 Young Generation(Eden+Survivor) 영역에 있는 객체들을 비어있는 Survival인 Survival1 영역에 이동하고 살아남은 모든 객체들은 age가 1씩 증가한다.

이 과정을 반복하다 보면 age bit가 특정 숫자 이상으로 되는 경우 발생합니다. 이때 JVM에서 설정해놓은 age bit에 도달하게 되면 오랫동안 쓰일 객체라고 판단하고 Old generation 영역으로 이동시킵니다. 이 과정을 프로모션(Promotion)이라고 합니다.

시간이 지나 Old 영역에 할당된 메모리가 허용치를 넘게 되면, Old 영역에 있는 모든 객체들을 검사하여 참조되지 않는 객체들을 한꺼번에 삭제하는 GC가 실행됩니다. 이렇게 Old generation영역의 메모리를 회수하는 GC를 Major GC라고 한다. Major GC는 시간이 오래 걸리는 작업이고 이때 GC를 실행하는 스레드를 제외한 모든 스레드는 작업을 멈추게 되며, 이를 Stop-the-World라고 한다. 이 작업이 너무 잦으면 프로그램 성능에 문제가 될 수 있다.

Old 영역에 대한 GC

  • Old 영역은 기존 데이터가 가득 차면 GC 실행
  • GC 방식에 따라 처리 절차가 다르다
  • JDK 7을 기준으로 5가지 방식
    1. Serial GC
    2. Parallel GC
    3. Parallel OLd GC(Parallel Compacting GC)
    4. Concurrent Mark & Sweep GC(CMS)
    5. G1(Garbage First) GC

Serial GC

  1. Old 영역의 GC는 mark-sweep-compact 알고리즘을 사용
    a. Old 영역에 살아있는 객체를 식별(Mark)
    b. Heap의 앞 부분부터 확인하여 살아있는 것만 남김(Sweep)
    c. 각 개체들이 연속되게 쌓이도록 힙의 가장 앞 부분부터 채워서 객체가 존재하는 부분과 객체가 없는 부분으로 나눔(Compaction)
  2. 메모리와 CPU 코어 개수가 적을 때 적합

Parallel GC

  1. Serial GC와 기본적인 알고리즘은 유사하나 Parallel GC는 GC를 처리하는 쓰레드가 여러개이고 Serial 보다 빠르게 객체를 처리 할 수 있다.
  2. young은 멀티쓰레드로 작동되며, old 영역은 단일 쓰레드로 작동한다.
  3. 메모리가 충분하고 코어의 개수가 많을 때 유리하다.

Parallel Old GC

  1. JDK 5 update 6 부터 제공
  2. Parallel GC와 비교하여 Old 영역의 알고리즘만 다르다
  3. Young영역 뿐만 아니라 Old영역도 멀티스레드로 처리한다
  4. Mark-Summary-Compaction 단계를 거친다.
    a. Summary 단계는 앞서 GC를 수행한 영역에 대해서 별도로 살아 있는 객체를 식별한다는 점에서 Mark-Sweep-Compaction 알고리즘의 Sweep 단계와 다르며 약간 더 복잡하다.
    b. summary-region별 통계정보로 살아있는 객체의 밀도가 높은 부분이 어디까지인지 dense prefix를 정한다. 오랜 기간 참조된 객체는 앞으로 사용할 확률이 높다는 가정하에 dense prefix를 기준으로 compact영역을 줄인다.

단계

  1. Initial Mark
    a. 클래스 로더에서 가장 가까운 객체 중 살아 있는 객체만 찾는다
    b. 멈추는 시간이 매우 짧음
  2. Concurrent Mark 단계
    a. 방금 살아있다고 확인한 객체에서 참조하고 있는 객체들을 따라가면서 확인
    b. 다른 스레드가 실행 중인 상태에서 동시 진행
  3. Remark 단계
    a. Concurrent Mark 단계에서 새로 추가되거나 참조가 끊긴 객체를 확인
  4. Concurrent Sweep 단계
    a. 쓰레기를 정리하는 작업을 실행
    b. 다른 스레드가 실행되고 있는 상황에서 진행

장점

  1. stop-the-world 시간이 매우 짧다
  2. 모든 애플리케이션의 응답 속도가 매우 중요할 때, CMS GC를 사용하며 Low Latency GC라고도 부른다

단점

  1. 다른 GC보다 메모리와 CPU를 많이 사용한다
  2. Compaction 단계가 기본적으로 제공되지 않는다

G1(Garbage First) GC

단계

  • 바둑판의 각 영역에 객체를 할당하고 GC를 실행
  • 해당 영역이 꽉 차면 다른 영역에서 객체를 할당하고 GC를 실행
  • Young의 세가지 영역에서 데이터가 Old 영역으로 이동하는 단계가 사라진 GC방식

장점

  • 위 다른 GC방식보다 빠르다.

단점

  • 아직 검증이 필요하다

출처 :https://coding-factory.tistory.com/829

0개의 댓글