💡 개요
자바는 정적 언어이고, JVM 위에서 동작하기 때문에 다른 언어들보다 느리다는 단점이 있다.
하지만 JVM 내부에는 JIT(Just-In-TIme) 컴파일러를 통해 성능을 향상한다는데 어떻게 그런 걸까?
📕 JIT 컴파일러
JIT 컴파일러는 런타임에 바이트코드를 네이티브 코드(기계어)로 변환하는 기술이다.
JVM 내부에선 컴파일러 시, 모든 코드를 네이티브 코드로 변환하는 것이 아닐, JVM이 바이트 코드를 해석하면서 실행한다.
그런데 바이트 코드를 한 줄 읽고, 또 그 코드를 네이티브 코드로 변환하면 당연히 속도가 드려질 수밖에 없다. (참고로 이 방식을 인터프리팅이라고 한다.)
JIT 컴파일러는 이를 해결하기 위해 핫스팟(반복적으로 사용되는 코드)을 감지해서 네이티브 코드로 변환한 후, 변환된 코드를 재사용할 수 있게 한다.
🛠️ JIT 컴파일러의 동작 방식
처음 실행
- 바이트코드가 JVM의 인터프리터(Interpreter)에 의해 한 줄씩 실행됨
- 이 단계에서는 빠르게 실행되지만 속도는 최적화되지 않음
핫스팟(Hotspot) 감지
- JVM은 반복적으로 실행되는 코드를 핫스팟으로 판단함
- 이 코드가 자주 실행된다는 걸 감지하면 JIT 컴파일러가 개입함
JIT 컴파일 및 최적화
- JIT 컴파일러는 핫스팟 코드를 네이티브 코드로 변환함
- 변환된 네이티브 코드를 캐시에 저장하여 이후 실행 시 빠르게 로드함
- 컴파일에 적용되는 기법은 불필요한 코드 제거(Dead Code Elimination), 인라이닝(Inlining), 루프 최적화(Loop Optimization) 등이 있음
이후의 컴파일 과정
- 동일한 코드가 다시 실행될 때 네이티브 코드로 변환된 부분을 재사용하여 속도를 극대화함
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.03.26 - REDO, UNDO (0) | 2025.03.26 |
---|---|
[개발 일기] 2025.03.25 - forward 프록시 (Nginx) (0) | 2025.03.25 |
[개발 일기] 2025.03.23 - 무중단 배포 (0) | 2025.03.23 |
[개발 일기] 2025.03.22 - 스케줄링 기법 (0) | 2025.03.22 |
[개발 일기] 2025.03.21 - 외부에서의 주입이 테스트 코드에 용이한 이유 (0) | 2025.03.21 |