핫스팟 가상 머신과 인터프리터, JIT 컴파일 Optimizing Java #4

BaekGwa·2024년 8월 26일

Optimizing Java

목록 보기
4/5

핫스팟 가상머신

핫스팟 가상 머신이란?

썬 마이크로시스템즈 에서 선보인 자바의 가상 머신 이다.
발표 이후, C/C++ 같은 저수준의 언어 보다 떨어지는 성능을 향상 시킬 수 있었다.

C/C++ vs Java (과거)

  • C/C++ 같은 저수준 언어에 비해 Java 언어가 갖는 장점은 명확 하였으나, 단점 또한 명확하였다.

C/C++

  • 저수준 언어에서는 컴파일을 통해 직접 실행이 가능한 네이티브 머신 코드 변환 합니다.
  • 네이티브 머신 코드로 변환된 코드는 하드웨어에 종속적이며, 해당 코드를 컴파일한 동일한 환경이 아니라면, 실행되지 않을 수 있습니다.
    • 이것을 그 플랫폼에서만 사용 가능한 컴파일 이라고 해서 사전 컴파일(AOT) 이라고 합니다.
  • 단, 네이티브 머신 코드를 실행 할 때, 별도의 해석 작업이 필요 없기 때문에 빠르게 동작 합니다.
  • 또한, 개발자가 컴퓨터와 OS가 실제로 어떻게 동작해야 하는지 아주 세세한 저수준까지 일러주어야 한다는 단점이 있다.

Java

  • 컴파일을 통해 JAVA 바이트코드로 변환 합니다.
  • 바이트코드는 JVM에서 동작하며, 정확하게는 인터프리터를 통해 해석 하고 실행 합니다.
  • 인터프리터를 통해 실행되어, 하드웨어나 운영체제에 종속적이지 않으며, 독립적입니다.
  • 즉, 바이트코드로 변환된 코드는 JVM 위에서는 어떤, 운영체제 에서든 실행이 가능합니다.
  • 단, 인터프리터를 통해 해석 이라는 새로운 작업이 추가되어 저수준 언어보다 낮은 성능을 보입니다.

핫스팟의 JIT 컴파일

  • 앞서 알아 봤듯이 자바 프로그램은 바이트코드를 인터프리터가 가상화한 스택 머신에서 명령어를 실행하면서 시작 됩니다.
  • CPU를 추상화한 구조라서, 다른 플랫폼에서도 클래스 파일을 문제없이 실행할 수 있지만, 프로그램의 성능을 최대로 내려면, CPU에서 직접 프로그램을 실행 시켜야 합니다.
  • 이를 위해서 핫스팟은 프로그램 단위를 인터프리트 바이트코드 에서 네이티브 코드로 컴파일을 진행 합니다.
  • 이를 JIT(Just-in-time) 컴파일 이라고 하는 기술 입니다.

핫스팟은 JIT 컴파일인터프리터와 어떻게 실행 할까요?

  • 핫스팟은, 인터프리트 모드로 실행되는 동안, 애플리케이션을 모니터링 하면서, 가장 자주 실행되는 코드 파트를 발견해서 JIT 컴파일을 수행 합니다.
  • 특정 메서드가 어느 한계치 임계점을 넘어가면 프로파일러가 특정 코드 섹션을 컴파일/최적화 진행 합니다.


JIT 컴파일의 장점

  • 컴파일러가 해석 단계에서 수집한 추적 정보를 근거로 최적화를 결정한다
    • 상황별로 수집한 다양한 정보를 토대로 핫스팟이 더 올바른 방향으로 최적화 한다
  • 인라이닝 (Inlining):
    • JIT 컴파일러는 작은 메서드나 자주 호출되는 메서드를 인라인화하여 메서드 호출의 오버헤드를 제거할 수 있습니다. 이 과정에서 불필요한 메서드 호출을 없애고 코드의 실행 속도를 높입니다.
  • 실행 시간 최적화
    • JIT 컴파일러는 런타임에 프로그램이 실제로 어떻게 실행되는지에 대한 정보를 바탕으로 최적화를 수행합니다. 이는 컴파일 타임에 미리 결정된 최적화보다 더 효율적인 경우가 많습니다. 예를 들어, JIT는 특정 조건문이 항상 참이거나 거짓인 경우를 인식하고, 이에 따라 불필요한 코드를 제거할 수 있습니다.

  • 이러한 장점으로 대부분의 일반 개발자는 많은 혜택을 누리게 됐지만, 제로-오버헤드 추상화를 포기한 탓에 고성능 자바 애플리케이션을 개발하는 사람들은 상싱적인 추론으로 애플리세이션이 실제로 동작하는 방식을 단순하게 넘겨 짚지 않도록 조심해야 한다.
profile
현재 블로그 이전 중입니다. https://blog.baekgwa.site/

0개의 댓글