본문 바로가기
자바/개념

[java] Garbage Collector(GC) - 가비지 컬렉터

by drCode 2021. 9. 18.
728x90
반응형
728x90

우아한 테크 참고 동영상 : https://www.youtube.com/watch?v=Fe3TVCEJhzo 

  • 가비지 컬렉터란?
  • 가비지 컬렉터가 Sweep 하는 것
  • Mark and Sweep(GC 작동 방식)
  • 가비지 컬렉터 작동 시점
  • 가비지 컬렉터 특징
  • 가비지 컬렉터 종류
반응형

1. Garbage Collector(GC) - 가비지 컬렉터란?

  : JVM의 Heap 영역에서 사용하지 않는 객체를 삭제하는 프로세스를 말함

 

Garbage Collector

Stack 메모리에는 int, char, double 형 자료형 변수들이 들어가고

Heap 메모리에는 String, List 등 Object형 인스턴스들이 들어간다.

 

2. 가비지 컬렉터가 Sweep 하는 것

 어떤 객체에 유효한 참조가 존재하면 Reachable, 그렇지 않다면 Unreachable이라고 하는데,

  GC Roots가 있고 트리 형식으로 데이터들이 서로 참조하는 그림이 있을 때, 더이상 참조되지 않는 객체들을 Unreachable Objects 라고 한다. 바로 이렇게 참조되지 않는 객체를 Sweep 한다.

Reachable and Unreachable

GC Roots가 될 수 있는 것은

1) stack 영역의 데이터들

2) method 영역의 static 데이터들

3) JNI에 의해 생성된 객체들

이 있다.

Unreachable 예제1
Unreachable 예제2

 

 

3. Mark and Sweep (GC 작동 방식)

 1) Mark : 가비지 컬렉터는 GC Roots로부터 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 잇는지 찾아서 마킹한다.

 

Unreachable 객체 Marking

 

 2) Sweep : Unreachable 객체들을 Heap에서 제거한다.

 

Unreachable 객체 Sweeping

 ※) Compact : Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 나눈다.

 

메모리 할당된 부분 조각모음(?)

 

4. 가비지 컬렉터 작동 시점

우선 힙 메모리 영역은 Young Generation과 Old Generation으로 구분된다.

힙메모리 구조

 

메타 스페이스라는 가비지 컬렉션을 실행할 클래스와 메소드의 영역이 별도로 존재한다.

메타 스페이스

 

1) 먼저 새로운 객체가 Eden 영역에 할당된다.

Eden 영역 객체 할당

2) Eden 영역이 가득 차게 되면 Minor GC가 발생하게 된다.

Minor GC 발생

 

3) Unreachable 객체와 Reachable 객체를 구분하여 Marking한다.

Marking

 

4) GC에서 살아남은 객체들은 Survivor 영역으로 이동한다.

Survivor 0 영역으로 이동

사실 Survivor 0 영역이든 Survivor 1영역이든 어느곳으로 이동해도 상관없긴 하지만 둘 중 한군데로 몰아서 이동해야 한다.

Survivor 0 영역으로 이동해서 몰아갔을 땐, 다음에는 Survirvor 1 영역으로 몰아서 가야한다.

 

5) Eden 영역의 Unreachable 객체들을 Sweep 한다

Unreachable 객체들을 Sweep 

 

6) Survivor 영역에 있는 객체들의 age를 증가한다.(Aging)

Aging

 

7) 다시 Eden 영역이 가득 차게 되면 Minor GC가 발생한다.

Minor GC
Minor GC

 

8) 다시 Unreachable 객체와 Reachable 객체를 Mark하여 구분한다.

Marking

9) Survivor 1 영역으로 Rechable 객체를 옮기고

Rechable 객체 이동

 

10) Sweep 한다

Eden 영역 Sweep

 

11) Rechable 객체의 Age가 증가한다.

Aging

12) 객체의 age가 age threshold에 도달하면 Old Generation으로 이동한다. (Promoted)

Promoted

 

13) Old Generation이 꽉 차면 Major GC가 일어난다.

Major GC 발생

이때 Major GC가 발생하면 메모리 누수가 발생하게 된다.

 

 

5. 가비지 컬렉터의 특징

 가비지 컬렉터에는 다음과 같은 가설이 있다.

 1) 대부분의 객체는 금방 접근 불가능한 상태(unreachable)가 된다. 즉, 금방 garbage가 된다.

 2) 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.

 

Rechable 객체 참조 그래프

※ Stop-the-world

  : GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것

   : GC를 실행하는 쓰레드 외의 모든 쓰레드가 작업을 중단한다.

  ==> 과거에는 메모리가 가득차게 되면 컴퓨터 중단 속도가 길었었는데,

         요즘은 멀티쓰레드 기능 향상으로 Stop-the-world 시간이 아주 짧아졌다고 한다.

 

6. 가비지 컬렉터의 종류

Serial GC

  1) Serial GC

    : GC를 처리하는 쓰레드가 1개 (싱글 쓰레드)

    : 다른 GC에 비해 stop-the-world 시간이 길다.

    : Mark-Compact(Sweep 포함) 알고리즘 사용

 

Parallel GC

  2) Parallel GC

    : Java 8의 Default GC

    : Young 영역의 GC를 멀티 쓰레드로 수행

    : Serial GC에 비해 stop-the-world 시간 감소됌

 

 

  3) Parallel Old GC

    : Parallel GC를 개선

    : Old 영역에서도 멀티 쓰레드 방식의 GC 수행

    : Mark-Summary-Compact 알고리즘 사용

          (sweep : 단일쓰레드가 old 영역 전체를훑는다., summary : 멀티쓰레드가 old 영역을 분리해서 훑는다.)

 

 

Parallel GC

  4) CMS GC(Concurrent Mark Sweep)

    : Stop-the-world 시간을 줄이기 위해 고안됌

    : Compact 과정이 없음

  

Initial Mark : GC Root에서 참조하는 객체들만 우선 식별

Concurrent Mark : 이전 단계에서 식별한 객체들이 참조하는 모든 객체 추적

Remark : 이전 단계에서 식별한 객체를 다시 추적, 추가되거나 참조가 끊긴 객체 확정

Concurrent Sweep : 최종적으로 unreachable 객체들을 삭제

 

G1 GC

   5) G1 GC(Garbage First)

     : CMS GC를 개선

     : Java 9+의 default GC 

     : Heap을 일정한 크기의 Region으로 나눔

     : 전체 Heap이 아닌 Region 단위로 탐색

     : compact 진행

 

728x90
반응형

댓글