저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다
1. 자바 가상 머신 제품군
| 제품명 | 시기/기반 | 주요 기능 및 특징 | 단점 및 한계점 |
| Sun Classic VM | JDK 1.0~1.2 | - 순수 인터프리터 방식 실행 | - 실행 효율이 낮음 (JIT 없음) |
| Exact VM | 초기 JVM | - 객체 포인터 정확히 추적 |
- 실험적 성격
|
| HotSpot VM | OpenJDK 기본 JVM | - 핫 코드 탐지 - JIT 컴파일 - 온스택 치환 |
- 메모리 사용량 증가
- 초기 워밍업 시간 필요 |
| GraalVM | Ployglot VM | - 다중 언어 지원 (Java, Kotlin, JS, Python 등) - 중간언어 변환 방식 - 빠른 실행 (Native Image 생성 가능) |
- 일부 기능 실험적
- 일부 언어는 제한적 지원 가능 |
2. 자바 기술의 미래
차세대 JIT 컴파일러
| 컴파일러 | 장점 | 단점 |
| C1 Compiler | ✔ 빠른 컴파일 ✔ 빠른 응답성 |
❌ 성능 최적화 부족 |
| C2 Compiler | ✔ 높은 성능 | ❌ 컴파일 시간 오래 걸림 |
| Graal Compiler | ✔ 높은 성능 ✔ 다언어 지원 가능 ✔ 유지보수 용이 |
❌ 실행 초기 메모리 소모 가능성 |
네이티브를 향한 발걸음
| 기술명 | 주요 목적 | 특징 및 장점 | 단점 및 한계점 |
| AppCDS | JVM 구동 시간 단축 | - 클래스 메타데이터 캐싱 - 여러 앱 간 공유 가능 |
- 클래스 구조가 바뀌면 다시 생성 필요 |
| Epsilon GC | 초단기 애플리케이션 최적화 | - 메모리 회수 없음 - 할당만 수행 → GC 오버헤드 없음 |
- 장기 실행 앱에는 사용 불가 - OutOfMemory 빠르게 발생 가능 |
| AOT Compiler | 실행 속도 향상 JVM 미탑재 환경 대응 |
- 사전 컴파일로 JIT 부담 없음 - 실행 파일 즉시 실행 가능 |
- OS/하드웨어별 별도 빌드 필요 - 리플렉션, 동적 바인딩 제약 |
3. 내 손으로 빌드하는 JDK
컴파일 매개변수
| 옵션 | 설명 |
| --with-debug-level=<level> | 디버깅 정보 및 최적화 수준 지정 |
| --with-native-debug-symbols=<방식> | 네이티브 코드 디버깅 심볼 포함 여부 |
| --with-version-string=<string> | 빌드되는 JDK의 버전 문자열 지정 |
| --with-jvm-variants=<변형> | 빌드할 JVM 변형(모드) 지정 |
| --with-jvm-features=<기능목록> | custom JVM에서 활성화할 기능 지정 |
| --with-target-bits=<비트> | 빌드할 JVM의 비트수 명시 |
| --with-<lib>=<path> | 외부 라이브러리 경로 지정 |
| --with-extra-<flag kind>=<flag> | 추가적인 컴파일러 플래그 전달 |
| --with-conf-name=<이름> | 설정 구성 이름 정의 (out 디렉토리 이름 등에 반영됨) |
표) -with-debug-level
더보기
| 값 | 의미 |
| release | 최적화 중심 (일반 배포용) |
| fastdebug | 디버그 + 일부 최적화 |
| slowdebug | 완전 디버그 (느림) |
표) -with-native-debug-symbols
더보기
| 값 | 의미 |
| none | 심볼 없음 |
| internal | 바이너리에 포함 |
| external | 외부 파일로 생성 |
| zipped | 압축 형태 |
표) - with-jvm-variants
더보기
| 값 | 의미 |
| server | 일반 서버용 (C2 포함) |
| client | C1 중심 (과거용) |
| minimal | 최소 기능 JVM |
| core | 핵심 기능만 |
| zero | 인터프리터만 (JIT 없음) |
| custom | 사용자 정의 |
표) -with-jvm-features
더보기
| 기능 이름 | 설명 | 사용 목적 | 비고 |
| cds | Class Data Sharing | 클래스 메타데이터 공유로 시작 속도 개선 | 기본 활성화 |
| shenandoahgc | Shenandoah GC | 저지연(저 pause) GC | 대용량 서버 |
| zgc | Z Garbage Collector | 초저지연 GC | 대규모 힙 |
| g1gc | G1 Garbage Collector | 균형형 GC | 기본 GC |
| serialgc | Serial GC | 단일 스레드 GC | 소규모 환경 |
| parallelgc | Parallel GC | 다중 스레드 GC | 처리량 중심 |
| jvmci | JVM Compiler Interface | Graal 같은 외부 JIT 연결 | Graal 사용 시 필요 |
| aot | Ahead-Of-Time 컴파일 | 실행 전 네이티브 컴파일 | 실험적 |
| dtrace | DTrace 지원 | 성능 분석 도구 지원 | Solaris/macOS |
| jfr | Java Flight Recorder | 런타임 모니터링 | 성능 분석 |
| nmt | Native Memory Tracking | 네이티브 메모리 추적 | 디버깅용 |
표) -with-extra-
더보기
| 종류 | 의미 |
| cflags | C 플래그 |
| cxxflags | C++ 플래그 |
| ldflags | 링커 플래그 |
예시) 명령어
더보기
bash configure \
--with-jvm-variants=custom \
--with-jvm-features=shenandoahgc,cds,jfr
'Java' 카테고리의 다른 글
| [JVM 밑바닥까지 파헤치기] 3-1. 가비지 컬렉터와 메모리 할당 전략: 회수 (1) | 2024.12.19 |
|---|---|
| [JVM 밑바닥까지 파헤치기] 2. 자바 메모리 영역과 메모리 오버플로 (1) | 2024.12.19 |
| [Java][Tutorial] 1-3. Learning the Java Language: Classes and Objects (0) | 2024.01.14 |
| [Java][Tutorial] 1-2. Learning the Java Language: Language Basics (0) | 2024.01.14 |
| [Java의 정석] 13-3. 스레드: 실행 제어 (1) | 2023.11.30 |