Java

[JVM 밑바닥까지 파헤치기] 11-2. 백엔드 컴파일과 최적화: JIT 컴파일러

noahkim_ 2024. 12. 25. 05:28

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

 

1. 적시 컴파일러

  • 핫코드들을 탐지하여 컴파일하고 최적화하여 실행 효율을 높임

 

2. 내장 컴파일러

클라이언트 컴파일러

  • 빠른 컴파일과 기본 최적화

 

서버 컴파일러

  • 서버측 성능을 극대화하도록 설정된 컴파일러

 

고급 최적화
  • 죽은 코드 제거, 순환문 언롤링, 순환문 표현식 호이스팅
  • 범위 검사 제거, null 검사 제거

 

3. 계층형 컴파일

  • 서버 모드의 기본 컴파일 전략

 

계층 0

  • 인터프리터로 실행
  • 프로파일링 X

 

계층 1

  • 클라이언트 컴파일러 사용
  • 프로파일링 X
  • 기본 최적화만

 

계층 2

  • 클라이언트 컴파일러 사용
  • 기본 프로파일링만 (메서드 통계)

 

계층 3

  • 클라이언트 컴파일러 사용
  • 모든 프로파일링

 

계층 4

  • 서버 컴파일러 사용
  • 모든 프로파일링
  • 모든 최적화

 

4. 컴파일 대상과 촉발 조건

핫코드

  • 자주 실행되는 메서드나 코드 블록

 

핫스팟 코드 탐지

샘플 기반
  • 스레드의 호출 스택 상단을 샘플링
  • 자주 발견될 경우 핫 메서드로 간주

 

카운터 기반
  • 각 메서드와 코듭 블록에 대한 카운터 설정 및 개별 실행 횟수 기록
  • 문턱값을 초과할 경우 핫 메서드로 간주

 

백 에지 카운터 기반
  • 루프 반복 횟수를 기반으로 핫코드를 탐지하는 방법
  • 온스택 치환 컴파일을 촉발하기 위함

 

5. 컴파일 과정

비동기

  • 컴파일은 백그라운드에서 비동기로 진행됨
  • 컴파일이 완료되면, 메서드의 호출 진입점 주소가 자동으로 새 값으로 덮여짐

 

과정

HIR 생성 (from 바이트코드)
  • 타깃 독립적 중간 표현
  • 최적화 구현을 도움 (정적 단일 할당을 표현)

 

HIR 최적화
  • null 검사 제거
  • 범위 검사 제거

 

LIR 생성 (from HIR)
네이티브 코드 생성 (from LIR)
  • 선형 스캔 레지스터 할당: 사용할 CPU 레지스터를 효율적으로 배정
  • 핍홀 최적화: 인접 명령어를 재구성하거나 불필요한 명령어를 제거

 

6. 환경변수

  • -Xint: 해석 모드로 고정
  • -Xcomp: 컴파일 모드로 고정
  • -XX: CompileThreshold: 카운터 기반 탐지 시, 핫코드 문턱값 설정 (기본값: 10000)
  • -XX: BackgroundCompilation: 백그라운드 컴파일 활성화
  • -XX: PrintCompilation: JIT 컴파일러가 네이티브 코드로 컴파일한 메서드의 이름 출력

 

7. 실행 모드

  • jvm 버전, 호스트 머신의 하드웨어 성능에 맞춰 자동으로 선택됨