기맹기 개발 블로그

[Java] JIT 메소드 인라인 본문

Java

[Java] JIT 메소드 인라인

기맹기 2023. 3. 2. 23:26

JIT 메소드 인라인

OOP에서 캡슐화를 위해 private 필드를 게터/세터만을 이용해서 접근할 수 있도록 합니다.

이로 인해 메소드 호출 스택이 늘어나는 오버헤드가 발생하지 않을까라는 의문을 해결해보고자 합니다.

 

Java JIT 컴파일러의 최적화

Java는 컴파일과 인터프리터 방식을 모두 사용합니다.

*.java 코드는 javac에 의해 *.class의 바이트코드로 변환됩니다.

JVM 내부에서는 바이트코드를 네이티브 코드로 변환하기 전에 JIT(Just-In-Time) 컴파일러는 런타임에 바이트코드를 최적화합니다.

이 때 최적화를 위해 메소드 인라이닝이 진행됩니다.

 

메소드 인라이닝

메소드 인라이닝 (inlining)이란 메소드를 호출을 본문으로 대체하는 것입니다.

JIT 컴파일러는 자주 호출하는 메소드를 인라이닝하여 메소드 호출 과정에서의 오버헤드를 줄입니다.

 

JIT가 인라이닝할 메소드를 선택하는 기준

1. 메소드의 크기가 작을 경우

  • getter/setter처럼 짧은 길이의 메소드는 실행하는 것보다 호출하는 오버헤드가 더 클 수 있습니다. 따라서 짧은 길이의 메소드는 인라인합니다.
  • 기본값은 메소드의 바이트코드 크기가 35byte보다 작을 경우 입니다.
    • -XX:MaxInlineSize= 를 이용해서 정의할 수 있습니다.

 

2. 자주 호출되고 너무 크지 않은 메소드일 경우

  • 자주 호출되는 메소드는 인라이닝하였을 때 성능 향상을 기대할 수 있습니다.
  • 따라서 호출 카운트를 이용해서 일정 수준 이상 자주 호출되면 Hot으로 설정됩니다.
  • Hot 상태이면서 너무 크지 않은 메소드는 인라인의 대상이 됩니다.
  • 기본값은 10,000회 호출 이상, 바이트코드가 325byte보다 작을 경우입니다.
    • -XX:FreqInlineSize= 를 이용해서 정의할 수 있습니다.

 

핫 메소드를 찾는 방법

JVM 플래그를 설정하여 컴파일동안 어떤 메소드가 핫으로 설정되었고, 크기가 임계를 초과했다고 판단했는지 확인할 수 있습니다.

-XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining
  • inline (hot) : 조건을 충족하고 인라인되었습니다.
  • hot method too big : 핫 메소드이지만, 바이트코드가 커서 인라인되지 않았습니다.

 

 


참고

'Java' 카테고리의 다른 글

[Java] JVM 구조  (0) 2023.03.05
[Java] Java의 멀티스레드  (0) 2023.02.18
[Java] 제네릭 (Generic)  (0) 2023.01.12