저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다
1. 자바 가상 머신 제품군
Sun Classic VM
- 세계 최초의 상용 JVM
- JDK 1.0
- 자바 코드를 순전히 인터프리터 방식으로 실행
단점
- 컴파일하는 시간이 많이 들어 실행 효율이 좋지 못함
Exact VM
- 정확한 메모리 관리
- 가상 머신이 메모리의 특정 주소 데이터를 알 수 있음
HotSpot VM
- OpenJDK의 기본 JVM
기능
- 핫 코드 감지
- 컴파일 했을 때 효과를 가장 크게 볼 수 있는 코드 영역을 컴파일해둠
- 런타임에 알아내어 JIT 컴파일러에 알려줌
- 온스택 치환
- 런타임에 컴파일한 소스로 스택을 치환함
Graal VM
cross-language
- Java, Kotlin, Scala, Groovy
- Javascript, Ruby, Python, WebAssembly
- LLVM Compiler-Based: C, C++, Rust
특징
- 다른 언어들을 혼용해서 사용할 수 있음
- 중간언어로 변환하여 작동하는 방식
- 추가비용 없음
- 호환성
- Java SE
2. 자바 기술의 미래
차세대 JIT 컴파일러
C1 Compiler
- 컴파일 속도 빠름 + 최적화 적음
C2 Compiler
- 컴파일 속도 느림 + 최적화 많음
Graal Compiler
- C2 Compiler의 대체
- 확장성 좋음
네이티브를 향한 발걸음
AppCDS (Application Class Data Sharing)
- 구동 시간을 줄이는 기술
- 로딩한 클래스 정보를 캐싱
엡실론 GC
- 메모리를 할당만 해주고, 회수하지 않음
- 간단한 작업을 빠르게 처리한 후 즉시 종료하는 애플리케이션에 적합
AOT Compiler
- 애플리케이션을 실행하기 전에 네이티브 코드로 컴파일 해둠
- 단점
- 동적 링크 특성이 크게 줄어듬
- 하드웨어와 운영체제별로 따로 컴파일 해둬야 함
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=<변형> | 핫스팟 가상 머신을 특별한 모드로 컴파일 함 | server client minimal core zero custom |
--with-jvm-features=<변형> | custom 가상머신용 기능 목록 지정 | |
--with-target-bits=<비트> | 가상 머신을 32bit or 64bit 로 컴파일 할 지 명시 | |
--with-<lib>=<path> | 라이브러리의 경로 지정 | boot-jdk freetype cups |
--with-extra-<flag kind>=<flag> | 컴파일에 필요한 추가적인 컴파일 매개변수 | cflags cxxflags ldflags |
--with-conf-name=<이름> | 컴파일 설정 |
'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 |