본문 바로가기

Backend/Java

JVM 구조와 GC 종류 간단 정리

JVM

Java byte code를 실행할 수 있는 주체
byte code를 OS에서 동작할 수 있도록 기계어로 변환하여 실행

JVM 언어

byte code는 다른 언어로도 만들 수 있음
- Java, Kotlin, Groovy, Scala, Clojure

특징

  • java byte code를 타켓 플랫폼에 상관없이 JVM 위에서 동작시켜 플랫폼 독립성 보장
  • 스택 기반의 VM
  • 가비지 컬렉션 (GC)

구조

https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0

Class Loader Runtime Data Area에 Java Class를 로드
로드(Loading) 링크(Linking) 초기화(Initialization)
Runtime Data Area OS로부터 할당받는 메모리 영역 [JVM 메모리 구조]
- Method Area: 클래스의 메타 정보, 모든 Thread가 공유
- Heap Area: 모든 객체의 인스턴스와 배열, 모든 Thread가 공유
- Stack Area: 메서드가 호출될 때 수행 정보, Thread마다 존재
- PC Register: 현재 수행 중인 JVM 명령의 주소, Thread마다 존재
- Native Method Stack: Java 외의 언어로 작성된 네이티브 코드, Thread마다 존재
Execution Engine byte code를 기계어로 변환하여 명령어 단위로 실행
명령어를 하나씩 수행하는 인터프리터 방식과 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일하는 JIT 컴파일러 방식이 있는데 두 가지 방식을 혼용해서 사용

 


전통적인 가비지 컬렉션 (GC)

더 이상 사용하지 않는 쓰레기 객체(Garbage)를 정리하는 작업
가비지 컬렉터가 정리하는 영역은 Heap 영역
Heap 영역은 Young 영역과 Old 영역으로 나눔

 

Young 영역

젊은 객체가 생성되고 Young 영역이 가득 차면 Minor GC 발생
Eden, Survivor0, Survivor1으로 구성

  1. 새로 생성된 객체는 Eden 영역에 저장
  2. Eden 영역이 가득차면 Minor GC가 발생하고 살아남은 객체는 하나의 Survivor 영역으로 이동
  3. Minor GC가 발생하면 Survivor 공간도 같이 검사를 해서 다른 survivor 공간으로 이동, Survivor 하나는 항상 비어 있는 상태
  4. 반복적인 Minor GC로 Survivor 영역을 옮길 때마다 살아남은 객체들은 Age가 계속 증가
  5. 특정 Age에 도달하면 Old 영역으로 이동 (Promotion)

Old 영역

오래된 객체가 살아남아 있고 Old 영역이 가득 차면 Major GC 발생

 

Stop the world

GC가 발생하면 GC를 제외한 모든 Thread가 동작을 멈추는 데 이를 "Stop the world"라고 함
특히, Major GC가 발생할 경우 육안으로 쉽게 확인될 정도로 오랜 시간이 걸림

주요 GC 종류

CMS GC (Concurrent Mark Sweep GC)

이전의 GC에 비해 "Stop the world" 시간이 짧음
CMS의 성능 문제

  • 동시 모드 실패
  • 과도한 GC 시간 및 OutOfMemoryError
  • 떠다니는 쓰레기
  • GC 주기의 여러 일시 중지

G1 GC (Garbage First GC)

CMS를 대체할 목적으로 G1이 설계되어 JDK 7에 도입되었고 JDK 9부터 default GC 채택

  1. Heap 영역을 일정 크기의 Region으로 구분
  2. 각 Region에 객체를 할당하고 GC를 실행
  3. 해당 Region이 모두 차면 다른 Region 객체를 할당하고 GC를 실행

위에 전통적인 GC 알고리즘은 간단히 이해하시고 새롭게 나오는 GC들의 컨셉을 알아야 합니다.
G1에 대한 내용은 아래 문서를 참고해주세요.
https://docs.oracle.com/en/java/javase/15/gctuning/garbage-first-g1-garbage-collector1.html

 

HotSpot Virtual Machine Garbage Collection Tuning Guide

 

docs.oracle.com

 

 

ZGC

JDK 11에서 소개된 확장 가능한 GC
JDK 14는 Windows 및 macOS 운영 체제에서 실험 기능으로 사용 가능
JDK 15부터 Production ready
JDK 16에 Concurrent Thread 스택 스캐닝
https://wiki.openjdk.java.net/display/zgc/Main

 

Main -     Main       -    OpenJDK Wiki

wiki.openjdk.java.net

 

 

Shenandoah GC

셰넌도어 GC
https://wiki.openjdk.java.net/display/shenandoah

 

Main -     Main       -    OpenJDK Wiki

wiki.openjdk.java.net



G1이 지속적으로 개선되고 있지만 새로운 GC들을 계속 지켜봐야겠어요.
개인적인 생각으로 ZGC는 조만간 공부해야 할 것 같습니다.