Java

[JVM 밑바닥까지 파헤치기] 1. 자바 기술 시스템 소개

noahkim_ 2024. 12. 19. 03:05

저우즈밍 님의 "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