Java

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

noahkim_ 2024. 12. 19. 03:05

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다

 

1. 자바 가상 머신 제품군

제품명 시기/기반 주요 기능 및 특징 단점 및 한계점
Sun Classic VM JDK 1.0 (최초 상용) - 순수 인터프리터 방식 실행 - 실행 효율이 낮음
Exact VM 초기 JVM 중 - 정확한 메모리 관리
- 메모리의 특정 주소 접근 가능
- 최신 정보 및 활용 예시 부족
HotSpot VM OpenJDK 기본 JVM - 핫 코드 감지
- JIT 컴파일
- 온스택 치환
- 메모리 사용량 증가 가능성
- 상황에 따라 성능 편차
GraalVM LLVM 기반
Java SE 호환
- 다중 언어 지원 (Java, Kotlin, JS, Python 등)
- 중간언어 변환 방식
- 추가 비용 없음
- 실험적 기능 존재
- 일부 언어는 제한적 지원 가능

 

2. 자바 기술의 미래

차세대 JIT 컴파일러

컴파일러 특징 장점 단점
C1 Compiler - 컴파일 속도 빠름
- 최적화 적음
✔ 빠른 컴파일
✔ 빠른 응답성
❌ 성능 최적화 부족
C2 Compiler - 컴파일 속도 느림
- 최적화 많음
✔ 높은 성능
✔ 복잡한 최적화
❌ 컴파일 시간 오래 걸림
Graal Compiler - C2 대체 가능
- 자바로 작성됨
- 확장성 뛰어남
✔ 유지보수 용이
✔ 다언어 지원 가능성
✔ 최적화 성능도 우수
❌ 실행 초기 메모리 소모 가능성

 

 

네이티브를 향한 발걸음

기술명 주요 목적 특징 및 장점 단점 및 한계점
AppCDS JVM 구동 시간 단축 - 클래스 메타데이터 캐싱
- 여러 앱 간 공유 가능
- 클래스 구조가 바뀌면 다시 생성 필요
Epsilon GC 초단기 애플리케이션 최적화 - 메모리 회수 없음
- 할당만 수행 → GC 오버헤드 없음
- 장기 실행 앱에는 사용 불가
- OutOfMemory 빠르게 발생 가능
AOT Compiler 실행 속도 향상
JVM 미탑재 환경 대응
- 사전 컴파일로 JIT 부담 없음
- 실행 파일 즉시 실행 가능
- OS/하드웨어별 별도 빌드 필요
- 리플렉션, 동적 바인딩 제약

 

3. 내 손으로 빌드하는 JDK

컴파일 매개변수

옵션 설명 예시 값
--with-debug-level=<level> 디버깅 정보 및 최적화 수준 지정
release, fastdebug, slowdebug
--with-native-debug-symbols=<방식> 네이티브 디버깅 심벌 정보 포함 여부 및 방식
none, internal, external, zipped
--with-version-string=<string> 빌드되는 JDK의 버전 문자열 지정
pre, opt, build, feature, interim, update, patch
--with-jvm-variants=<변형> 빌드할 JVM 변형(모드) 지정
server, client, minimal, core, zero, custom
--with-jvm-features=<기능목록> custom JVM에서 활성화할 기능 지정
쉼표로 구분된 기능 목록
--with-target-bits=<비트> 빌드할 JVM의 비트수 명시 32, 64
--with-<lib>=<path> 외부 라이브러리 경로 지정
boot-jdk, freetype, cups 등
--with-extra-<flag kind>=<flag> 추가적인 컴파일러 플래그 전달
cflags, cxxflags, ldflags
--with-conf-name=<이름> 설정 구성 이름 정의 (out 디렉토리 이름 등에 반영됨)
my-debug-build, optimized 등