Java

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

noahkim_ 2024. 12. 19. 03:05

저우즈밍 님의 "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=<이름> 컴파일 설정