on
JVM (Java Virtual Machine) 간단 정리
JVM (Java Virtual Machine) 간단 정리
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으로 구성
새로 생성된 객체는 Eden 영역에 저장 Eden 영역이 가득차면 Minor GC가 발생하고 살아남은 객체는 하나의 Survivor 영역으로 이동 Minor GC가 발생하면 Survivor 공간도 같이 검사를 해서 다른 survivor 공간으로 이동, Survivor 하나는 항상 비어 있는 상태 반복적인 Minor GC로 Survivor 영역을 옮길 때마다 살아남은 객체들은 Age가 계속 증가 특정 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 채택
Heap 영역을 일정 크기의 Region으로 구분 각 Region에 객체를 할당하고 GC를 실행 해당 Region이 모두 차면 다른 Region 객체를 할당하고 GC를 실행
위에 전통적인 GC의 알고리즘은 필요한 경우가 아니라면 이제는 자세히 보지 않으셔도 됩니다.
G1에 대한 자세한 내용은 아래 튜토리얼을 참고하시는 것이 좋을 것 같습니다.
https://docs.oracle.com/en/java/javase/15/gctuning/garbage-first-g1-garbage-collector1.html
ZGC
JDK 11에서 소개된 확장 가능한 GC
JDK 14는 Windows 및 macOS 운영 체제에서 실험 기능으로 사용 가능
JDK 15부터 Production (Default 아님)
개인적으로 현재 G1을 대체할 가장 강력한 후보라고 생각합니다.
https://wiki.openjdk.java.net/display/zgc/Main
Shenandoah GC
JDK 12의 일부로 출시된 GC
https://wiki.openjdk.java.net/display/shenandoah
from http://gofnrk.tistory.com/127 by ccl(A) rewrite - 2021-09-16 03:00:58