← 질문 목록
#65깊이 0
왜 모든 바이트코드를 바로 최적화하지 않는가?
모두 최적화하면 시작이 느려지고 실행되지 않을 코드에도 비용을 쓴다. JVM은 실행 정보를 모아 자주 쓰이는 코드만 기계어로 최적화한다.
- 인터프리터
그다음은 프로파일입니다. 실행 횟수와 타입을 수집한다
프로파일그다음은 JIT입니다. 뜨거운 메서드와 루프를 고른다
JIT그다음은 기계어입니다. 인라이닝과 특수화를 적용한다
기계어
HotSpot의 계층형 컴파일은 C1으로 빠르게 컴파일한 뒤 충분히 뜨거운 코드를 C2로 더 최적화한다. 시작 속도와 최고 성능을 절충한다.
JIT는 관찰된 타입을 바탕으로 가상 호출을 인라이닝할 수 있다. 가정이 깨지면 최적화 코드를 폐기하고 디옵티마이즈한다.
그래서 짧은 벤치마크는 워밍업과 컴파일 시간을 섞어 잘못 읽기 쉽다. JMH처럼 워밍업과 측정을 분리해야 한다.