본문 바로가기
프로그래밍언어

java8이전과 이후의 garbage collector의 동작과 종류

by 흰색남자 2023. 3. 26.

목차

0. 사전 용어 정리  & GC가 중요한 이유

1. Minor gc와 major gc.

2. 다양한 GC 알고리즘

 

0. 사전 용어 정리

- Garbage collector ( GC ) : 힙메모리의 OOM 에러를 막기 위해 참조되지 않는 객체들을 제거하는 작업
- Eden space : 객체가 힙메모리에 이제 막 할당되어 저장되는 메모리 공간.
- From Survivor space (S0): Eden 영역에서 GC가 수행된 후 살아남은 객체들이 저장됨

- To Survivor space (S1): From 영역에서 살아남은 객체들이 옮겨지고, From영역으로 전환됨. 객체가 살아남으면 age가 1씩 증가함.
- Tenured Generation : 위 3개 영역에서의 객체가 설정된 임계치의 age를 넘었을 경우 이 영역으로 이동됨.
- *Permanent Generation : Tenured Gen의 다음 영역으로, 사용되는 클래스와 함수의 메타데이터를 보관하는 장소.
현재까지 로드된 클래스와 메서드의 메타 데이터, static 변수, 상수 정보들이 저장됨. 
- Reachable : 객체가 참조되고 있는 상태
- Unreachable  : 객체가 참조되고 있지 않은 상태 (GC의 대상이 됨) 

* 자바8 부터 Heap영역에 존재하던 Permanent Generation이 Native Memory에 할당됨

 

GC가 중요한 이유

  • 가비지 컬렉션 중에서 마이너 GC의 경우에는 보통 0.5 이내에 끝나기 때문에 큰 문제가 되지 않지만, 그러나 FULL GC의 경우에는 자바 애플리케이션이 멈춰 버리기 때문에, 문제가 될 수 있다.
  • 멈추는 동안 사용자의 요청이 큐에 들어있다가, 순간적으로 요청이 한꺼번에 들어오기 때문에 과부하에 의한 여러 장애를 만들 수 있다.
  • 따라서 원활한 서비스를 위해서는 GC가 어떻게 일어나게 하느냐가 시스템의 안정성과 성능에 큰 변수로 작용할 수 있다.

 

1. Minor gc와 major gc

GC의 영역( 처리 범위, 조건 등 )은 2가지로 나뉜다.

- Minor GC : Eden ( Heap 메모리에 지금 막 할당된 객체의 영역 )부터 Survivor 영역까지 처리한다.
                     해당 영역이 가득차면 발생하게 됨.
- Major GC : Tenured Generation과 Permanent Generation의 GC를 수행한다.
                    해당 영역이 가득차거나 거의 가득차면 발생하게 됨.
- 일반적으로 young 영역에서의 minor gc에서 15~45번 살아남아야 old 영역으로 넘어간다고 한다. 

 

2. 다양한 GC 알고리즘

  1. Serial GC: Stop-the-World 가비지 수집을 수행하는 단순한 단일 스레드 GC. 소규모 애플리케이션에 적합하며 힙이 크거나 프로세서가 여러 개인 애플리케이션에는 권장않음
    • Minor GC: Copying(또는 Scavenging) 알고리즘
    • Major GC: Mark-Sweep-Compact 알고리즘
  2. Parallel GC: 애플리케이션 스레드와 병렬로 가비지 수집을 수행하는 다중 스레드 가비지 수집기입니다. 높은 처리량이 필요하고 힙이 큰 애플리케이션에 적합합니다.
    • Minor GC: Copying(또는 Scavenging) 알고리즘
    • Major GC: Mark-Sweep-Compact 알고리즘


  3. CMS GC: 이 가비지 수집기는 애플리케이션 스레드와 동시에 가비지 수집을 수행하여 애플리케이션 성능에 미치는 영향을 최소화함. 대기 시간이 짧고 힙이 큰 애플리케이션에 적합.
    • Minor GC: Copying(또는 Scavenging) 알고리즘
    • Major GC: Concurrent Mark-Sweep 알고리즘


  4. G1GC: GC에 지역 기반 접근 방식을 사용하며 처리량 또는 대기 시간 목표를 충족하도록 구성할 수 있음. 힙이 큰 애플리케이션에 적합하며 가비지 수집 일시 중지 측면에서 더 나은 예측 가능성을 제공할 수 있음.
    • Minor GC: 라이브 객체의 일부 표시 및 제거가 있는 대부분 복사(또는 청소) 알고리즘
    • Major GC: 라이브 객체의 일부 복사 및 제거가 있는 대부분 마킹 및 압축 알고리즘


    • Minor GC: Concurrent Copying(또는 Scavenging) 알고리즘
    • Major GC: Concurrent Marking and Compaction 알고리즘Parallel Old GC: Tenured Generation의 가비지 수집에 사용되는 표준 Mark-Sweep-Compact 알고리즘의 병렬 버전. 높은 처리량이 필요하고 힙이 큰 애플리케이션에 적합

 

각 GC의 알고리즘은 다음 편에 작성함.

 

## Permanent Generation이 사라지고 Metaspace가 추가된 이유는?

최근 Java 8에서 JVM 메모리 구조적인 개선 사항으로 Perm 영역이 Metaspace 영역으로 전환되고 기존 Perm 영역은 사라지게 되었다. Metaspace 영역은 Heap이 아닌 Native 메모리 영역으로 취급하게 된다. (Heap 영역은 JVM에 의해 관리된 영역이며, Native 메모리는 OS 레벨에서 관리하는 영역으로 구분된다) Metaspace가 Native 메모리를 이용함으로서 개발자는 영역 확보의 상한을 크게 의식할 필요가 없어지게 되었다.

 

 

 

https://linux.systemv.pe.kr/%EC%9E%90%EB%B0%94-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98/

https://velog.io/@guswlsapdlf/Java%EC%9D%98-JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0

https://syhwang.tistory.com/89

https://www.holaxprogramming.com/2013/07/20/java-jvm-gc/

https://programmerhoiit.tistory.com/71

https://unordinarydays.tistory.com/170

https://woooongs.tistory.com/51

https://plumbr.io/blog/garbage-collection/minor-gc-vs-major-gc-vs-full-gc