GC (Garbage Collector)

midas·2022년 5월 25일
0

GC란?

Garbage는 컴퓨터 메모리에 있지만, 앞으로 사용되지 않을 데이터나 객체 또는 메모리 영역을 가리킵니다.
모든 컴퓨터 시스템은 제한적인 메모리를 가지고 있고, 대부분의 소프트웨어는 Garbage를 만들어내기 때문에, 이를 메모리에서 해제하여 다시 사용할 수 있게 해야 합니다.

GC의 장단점

장점

  • 메모리 누수 방지
  • 해제된 메모리에 접근 방지
  • 해제한 메모리를 중복 해제 방지

단점

  • GC 작업은 순수 오버헤드
  • 개발자는 언제 GC가 메모리를 해제하는 제 모름
  • 의도적으로 GC를 실행시켜야 한다.
  • 애플리케이션 실행과 GC실행이 병행 된다.

GC의 메모리 관리

  1. GC가 Stack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹합니다.
  2. Reachable Object가 참조하고 있는 객체도 찾아서 마킹합니다.
  3. 마킹되지 않은 객체를 Heap에서 제거합니다.
    방법에 따라 Compact 과정을 거칠 수 있다.

먼저 GC는 2가지 전제(weak generational hypothesis)로 만들어졌습니다.

  1. 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다.
  2. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.

이러한 가정으로 인해서 물리적인 공간을 2개로 나누었습니다.

👶 Young Generation : 새로운 객체들이 할당되는 영역

  • Eden
    • 새로운 객체는 Eden 영역에 할당된다.
    • 가득차게 되면 Minor GC 발생 → Mark & Sweep 발생
    • Eden 영역의 Reachable 객체는 Survival 0 으로 옮겨집니다.
      (Eden 영역의 Unrachable 객체는 메모리에서 해제)
  • Survival 0
    • 가득차게 되면 Minor GC 발생 → Mark & Sweep 발생
    • Reachable 객체는 Survival 1 로 옮겨집니다.
      (이동한 객체는 Age 값이 증가한다? 🤔 → 1에서 0, 0에서 1로 이동할 때마다 age값이 증가합니다.)
    • 이제는 Eden이 가득차게 되면 Survival 1로 옮겨집니다!
      (Survival 0이나 1 둘중 하나는 무조건 비어 있습니다.)
  • Survival 1

Age 값이 특정 값 이상이 되면 Old Generation 영역으로 옮겨집니다.
이 과정을 Promotion 이라고 합니다.

🧔‍♂️ Old Generation : Young Generation에서 오랫동안 살아남은 객체들이 존재하는 영역
Old Generation 영역이 가득차면 GC를 실행하는데, 이를 Major GC라고 합니다.

📦 meta space
가비지 컬렉션 시에 필요한 클래스와 메소드의 요약 정보가 존재하는 영역

📌 주의사항

  • System.gc() 메서드는 시스템의 성능에 매우 큰 영향을 끼치므로 절대로 사용하면 안된다!

GC 종류

Serial GC

GC를 처리하는 스레드가 1개이다.
CPU 코어가 1개만 있을 때 사용하는 방식
Mark-Compact Collection 알고리즘 사용

Parallel GC

GC를 처리하는 스레드가 여러 개 있다.

Serial GC보다 빠르게 객체를 처리할 수 있다.
Parallel GC는 메모리가 충분하고 코어의 개수가 많을 때 사용하면 좋다.

😓 Concurrent Mark Sweep GC (CMS GC)

📌 Stop-The-World
GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다.
stop-the-world가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춥니다.
GC 작업을 완료한 이후에 중단한 작업을 다시 시작한다.

stop-the-world 시간이 짧다.
애플리케이션 응답 시간이 빨라야 할 때 CMS GC를 사용한다.

다른 GC 방식보다 메모리와 CPU를 더 많이 사용한다.
Compaction 단계가 제공되지 않는다.

📌 하지만 현재는...?
Java 9 부터 CMS 가비지 수집기는 더 이상 사용되지 않습니다.
또한 Java 14 는 CMS 지원을 완전히 중단했습니다.

G1 GC

Java9 부터는 G1 GC를 사용한다고 합니다.

CMS GC를 개선
각 영역을 Region 영역으로 나눈다.

GC가 일어날 때,
전체 영역(Eden, Survival, Old generation)을 탐색하지 않는다.
(할당된 리전에 대해서만 탐색)

G1 GC는 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다.
그러다가, 해당 영역이 꽉 차면 다른 빈 영역에, 객체를 할당하고 GC를 실행한다.

G1 GC는 STW 시간이 짧다.
Compaction을 사용한다.

profile
BackEnd 개발 일기

0개의 댓글