TIL

Chapter 10. JIT 컴파일의 세계로

10.1 JITWatch란?

핫 패스에 있는 컴파일 대상 메서드를 분석 대상으로 삼아야 한다. 인터프리티드 메서드는 최적화 대상으로 적절치 않다.

10.1.1 기본적인 JITWatch 뷰

10.1.2 디버그 JVM과 hsdis

10.2 JIT 컴파일 개요

10.3 인라이닝

10.3.1 인라이닝 제한

10.3.2 인라이닝 서브시스템 튜닝

스위치 디폴트(JDK 8, Linux x86_64) 설명
-XX:MaxInlineSize= 35바이트의 바이트코드 메서드를 이 크기 이하로 인라이닝
-XX:FreeqInlineSize= 325바이트의 바이트코드 핫 메서드를 이 크기 이하로 인라이닝
-XX:InlineSmallCode= 1000바이트의 네이티브 코드(단계 없음), 2000바이트의 네이티ㅡㅂ 코드(단계 있음) 코드 캐시에 이 수치보다 더 많은 공간을 차지한 최종 단계 컴파일이 존재하는 경우 인라이닝하지 않는다.
-XX:MaxInlineLevel= 9 이 수준보다 깊은 호출 프레임을 인라이닝하지 않는다.

10.4 루프 펼치기

10.4.1 루프 펼치기 정리

세이프포인트 폴 - 세이프포인트 도달 여부를 폴링하여 체크하는 코드이다. JIT 컴파일러는 컴파일드 코드가 오랫동안 세이프포인트 플래그 체크 없이 실행되지 않도록 세이프 포인트 검사 코드를 삽입한다.

10.5 탈출 분석

탈출 분석 최적화는 반드시 인라이닝 수행 이후 시도한다. 호출부에 피호출부 메서드를 복사하면 호출부에 메서드 인수로 전달된 객체는 더 이상 탈출 객체로 표시되지 않기 때문

10.5.1 힙 할당 제거

10.5.2 락과 탈출 분석

이 최적화는 synchronized를 사용한 인스린직 락에만 해당되며 java.util.concurrent 패키지의 락에는 적용되지 않는다.

10.5.3 탈출 분석의 한계

10.7 인트린직

인트린직은 C1/C2 JIT 컴파일러 및 인터프리터에도 구현 가능하다.

메서드 설명
java.lang.System.arraycopy() CPU의 백터 지원 기능으로 배열을 빨리 복사
java.lang.System.currentTimeMillis() 대부분 OS가 제공하는 구현체가 빠름
java.lang.Math.min() 일부 CPU에서 분기 없이 연산 가능
기타 java.lang.Math 메서드 일부 CPU에서 직접 명령어를 지원
암호화 함수 (ex. AES) 하드웨어로 가속하면 성능이 매우 좋아짐

자바 9부터 메서드 앞에 @HotSpotIntrinsicCandidate 애너테이션을 붙여 인트린직을 사용할 수 있음을 나타낸다.

10.8 온-스택 치환

10.9 세이프포인트 복습

10.10 코어 라이브러리 메서드

JDK 코어 라이브러리 크기가 JIT 컴파일에 주는 영향 살펴보기

10.10.1 인라이닝 하기 적합한 메서드 크기 상한

도메인에 특정한 메서드로 성능 개선

메서드를 작게 유지하면 좋은 점

10.10.2 컴파일하기 적합한 메서드 크기 상한