JVM warm up (if(kako) 정리)

StarSeeker·2022년 12월 14일
0

java는 기본적으로
source Code를 Compile 한후 ByteCode를 interprete해서 JVM에서 실행됨.

바로 기계어로 컴파일되는 언어들은 해당 빌드환경(운영체제)에 종속됨.

따라서 기본적으로 java가 속도가 더 느리다.
근데 느리기만 할까?

그래서 JIT(Just in Time) Compiler (적시에 기계어를 만들어낸다) 가 나오게 됨.

이를 통해 반복되는 컴파일을 기계어를 캐시하여 최적화한다.

하지만 어플리케이션이 시작될때는 캐시된 것이 없기 때문에 최적화가 일어나지 못한다.

그래서 warm up 단계를 두어 미리 최적화 단계로 접근할수 있게 한것!

JIT 내부 과정

  • Method: 바이트 코드는 native 코드로 컴파일됨.
  • Profiling: 프로파일링 작업
  • Tiered compilation: 코드최적화, C1, C2 단계로 이루어짐
  1. c1 - optimaization 간략한 최적화
  2. c2 - fully optimization 최대 최적화

Tiered comiliation은 아래의 레벨로 나누어짐

level0 - 인터프리터가 최초로 기계어로 번역하는 단계
level1 - 더이상 최적화가 필요없는 간략한 코드들을 컴파일하는 단계
level2 - 제한된 최적화가 적용되는 단계
level3 - 최적화가 적용되고 프로파일링이 되는 단계
level4 - 최대 최적화가 적용되는 단계, 프로파일링 되는 단계

  1. level0에서 코드가 기계어로 번역되고 임계치를 넘어서면 leve3 단계가 적용하여 코드캐시에 저장
  2. c2 임계치를 넘어서면 level4 단계가 적영되어 코드 캐시에 저장.
  3. c1, c2는 각각의 스레드에서 병렬적으로 실행
  4. c2 컴파일러 큐가 가득차면 c1 레벨2로 단계가 적용
  5. 다시 큐가 여유가 생기면 c1 3, c2 4레벨로 다시 적용됨

문제 해결과정

샘플코드를 실행해 샘플코드에 대한 프로파일링 정보가 확인한다.


c2 레벨 4가 적용된 것을 알 수 있다. 그리고 임계치도 확인가능 (19000)

c1,c2가 얼마나 호출되었는지 카운트 한뒤 적절한 warm up count를 선택한다.
발표에서 예시된 문제는 250으로 설정하여 해결.
뒤로 갈수록 최적화가 더 잘이루어지지만 웜업 시간이 더 오래걸리기 때문에 적절한 카운트를 선택해야한다.

profile
춤추듯 개발하고 싶은 사람

0개의 댓글