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