저우즈밍 님의 "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 버전, 호스트 머신의 하드웨어 성능에 맞춰 자동으로 선택됨
'Java' 카테고리의 다른 글
[JVM 밑바닥까지 파헤치기] 12-2. 자바 메모리 모델과 스레드: 자바 메모리 모델 (1) | 2024.12.26 |
---|---|
[JVM 밑바닥까지 파헤치기] 12-1. 자바 메모리 모델과 스레드: 동시성 (1) | 2024.12.25 |
[JVM 밑바닥까지 파헤치기] 11-1. 백엔드 컴파일과 최적화: 백엔드 컴파일 (0) | 2024.12.25 |
[JVM 밑바닥까지 파헤치기] 10-2. 프런트엔드 컴파일과 최적화: 편의 문법 (0) | 2024.12.25 |
[JVM 밑바닥까지 파헤치기] 10-1. 프런트엔드 컴파일과 최적화: 프런트엔드 컴파일 (0) | 2024.12.24 |