-
Notifications
You must be signed in to change notification settings - Fork 0
고동훤, 김현욱, 김현종, 최현식 JVM
Dr-KoKo edited this page Jul 10, 2024
·
10 revisions
특정 클래스를 활용해야하는 시점에 해당 클래스를 동적으로 로딩함
- Bootstrap Class Loader
- JRE의 핵심 클래스 로딩 (예:
rt.jar
)- 기본적으로 JVM 자체에 포함되어 있으며,
rt.jar
파일 등과 같은 핵심 java 클래스를 로드 - 부트스트랩 클래스로더는 Native 코드로 작성되었기 때문에 자바 내에서는 null로 표기됨
- 기본적으로 JVM 자체에 포함되어 있으며,
- 예. ArrayList.class.getClassLoader()
- JRE의 핵심 클래스 로딩 (예:
- Extension Class Loader
- 확장 클래스 로딩 (예:
javax
패키지)- 표준 핵심 Java 클래스의 확장 클래스를 로드
- 예. DriverManager.class.getClassLoader()
- 확장 클래스 로딩 (예:
- Application Class Loader
- 애플리케이션 클래스 로딩
- 어플리케이션 레벨의 클래스(예를 들어 우리가 작성한 클래스)를 JVM에 로드
- 예. HttpRequest.class.getClassLoader()
- 애플리케이션 클래스 로딩
- Verify
- 파일 형식이 올바른지 확인 (예: Magic number
0xCAFEBABE
확인) - 변수 및 메서드가 올바른 타입을 가지고 있는지
- 파일 형식이 올바른지 확인 (예: Magic number
- Prepare
- 클래스의 모든 정적 변수를 위한 메모리 할당
- 해당 타입의 "기본값으로" 초기화
- Resolve
- 심볼릭 레퍼런스(ex. 클래스 이름, 메서드 이름)를 실제 메모리 레퍼런스로 변환
- static 변수 초기화
- static block 실행
- 자주 사용되는 코드에 대해 네이티브 코드로 최적화하고 해당 값을 캐싱하여 활용하게 도와주는 컴파일러
- JIT 컴파일러의 캐시 히트율은 90% 이상으로 성능 향상에 큰 도움
- '자주 사용되는'의 기준은 프로파일러가 프로파일링을 하며 최적화 여부를 판단 (얼마나 자주, 어디에서 호출되는지)
- mark & sweep : 객체를 마크(mark)한 후, 사용되지 않는 객체를 스윕(sweep)하여 메모리를 해제합니다.
- copy : 메모리를 두 개의 공간으로 나누고, 하나의 공간에서 사용 중인 객체를 다른 공간으로 복사하여 살아 있는 객체만 남깁니다.
- mark & compact : 객체를 마크(mark)한 후, 모든 살아 있는 객체를 한쪽으로 압축(compact)하여 메모리 단편화를 줄입니다.
- Serial : Single-threaded GC. 작은 힙 영역에 적합하며, 모든 GC 작업을 단일 스레드에서 처리합니다.
- Parallel : Multi-threaded GC. 여러 스레드를 사용하여 GC 작업을 병렬로 수행합니다.
- CMS(Concurrent Mark-Sweep) : Mark-Sweep 알고리즘을 기반으로 한 GC. 애플리케이션 스레드와 병행하여 작동하며, Stop-The-World 시간을 줄입니다.
- G1 (Garbage First) : 힙을 여러 영역으로 나누어 병렬로 GC를 수행합니다. 예측 가능한 GC 시간을 목표로 합니다.
- ZGC (Z Garbage Collector) : 매우 낮은 Stop-The-World 시간을 목표로 하는 GC. 큰 힙 영역을 효율적으로 관리합니다.
- minor gc : : Young Generation에서 발생하는 GC. : 비교적 빠르게 수행되며, 주로 단기 생명 주기를 가지는 객체를 수집합니다.
- major gc : Old Generation에서 발생하는 GC. : Young Generation의 객체가 오래 살아남아 Old Generation으로 이동한 후에도 계속 살아남는 객체를 수집합니다. Major GC는 더 많은 시간을 소요할 수 있습니다.
: Garbage Collection 과정에서 JVM이 애플리케이션 스레드를 일시 중지하고 GC 작업을 수행하는 상태를 말합니다. 힙 영역이 꽉 차면 GC(Minor or Major)가 발생하고, 이 때 STW가 일어납니다.
: 에덴동산이 꽉 차니 세상이 멈추더라
- 새로운 객체들이 YG 의 eden 영역에 생성됨
- eden 영역이 가득차게되면 stw가 실행되며 minor gc가 실행됨.
- minor gc로 살아남은 객체들은 반대쪽 survival 영역으로 이동된 뒤 나머지 garbage는 해제됨
- survival 영역을 넘나들며 age bit가 증가하게되는데, 일정 age bit를 초과한 객체들은 OG 영역으로 이동됨
- stw가 해제됨
- OG 영역이 가득차게되면 stw 와 major gc가 실행됨.