[Java를 실행하면 어떻게 진행이 되나요?] 2-2. JVM-Execution Engine

khyojun·2022년 11월 29일
3
post-thumbnail

🔍 Java 실행 과정

오늘은 두 번째 항목인 Execution Engine에 대해서 알아보자

  • ✔ Class Loader
  • Execution Engine
  • Runtime Data Area
  • GarbageCollector

🔍 Execution Engine

말 그대로 실행 엔진이다. 그럼 실행 엔진은 이제 Class Loader에 의해서 메모리 영역으로 전달된 바이트 코드들을 실행할때 동작할 거라는 걸 의미로 짐작해서 생각해볼 수 있었다.

이렇게 바이트 코드들을 바로 실행하는 건 불가능하다! 왜냐하면 CPU는 바이트 코드를 이해하지 못하기에 기계어로 번역하는 과정이 필요하다! 그렇게 하기 위한 방법에는 대표적으로 2가지 방법이 있다고 한다.

  • Interpreter
  • JIT(Just In Time)

📌 Interpreter

바이트 코드를 읽어서 기계 코드로 변환하고 순차적으로 실행을 한다. 명령어를 하나 하나씩 실행하는 방법이라고 생각하면 좋을 거 같다. 그런데 이런 방식에는 문제가 하나 있다.

❗ 단점

예를 들면 동일한 메서드를 여러 번 수행하더라도 할 때마다 매번 변환하거나 해석하는 과정을 거친다는 것이다. 그렇게 되면 당연히 효율적이지가 않다. 그래서 뒤에서 언급할 JIT라는 방식이 도입되었다고 한다.

⏲ JIT(Just In Time)

JIT 컴파일러는 앞서 말했던 Interpreter의 단점을 해결하기 위해서 나온 방법인 만큼 속도가 느린 단점을 극복하고 시스템의 성능을 향상시키기 위해서 도입된 방법이다.

❗ Interpreter의 단점 개선

컴파일에 필요한 시간을 줄이기 위해서 바이트 코드의 유사한 부분을 동시에 컴파일 해버린다.
실행 시점에 인터프리터 방식으로 기계어 코드를 생성 하면서 그것을 따로 캐싱을 하고 나중에 동일한 부분이 호출되면 캐싱해둔 코드를 불러다가 사용하는 방식이기에 인터프리터 방식보다 빠르다고 볼 수 있다.

int a = 19;
Display(a);
Display(a);
Display(a);

예를 들어 이런 유형의 코드가 있다고 했을때 Interpreter방식으로 했으면 Display라는 동일한 메서드를 수행하는데 계속 같은 행위를 반복했을 것이다. 그런데 JIT의 방식으로 진행을 하게 되면 Display에 대한 것을 캐싱을 한 후 이후 동일한 작업이 진행되었을때 캐싱해둔 코드를 불러서 사용하기에 Interpreter방식보다 속도도 빠르고 효율도 좋다는 것을 알 수 있었다.

📕 Java는 많이 느리던데~~

오늘 글을 정리하면서 자료들을 찾아보다 보니 나도 이런 말을 들은 적이 있었는데 자바는 속도가 너~무 느리다 라는 말이 있다. 그런 이유에 내가 생각하기에는 Interpreter라는 방식으로 계속 동작하고 있어서 그랬던 거 같다. 그리하여 JIT라는 방법도 나오고 개선하려는 노력을 하면서 성능을 향상시키고자 유지 보수를 하는 것이 진짜 개발자가 아닐까 하는 생각을 하며 오늘 글을 마친다.

JVM 기능 정리

  • ✔ Class Loader
  • ✔ Execution Engine
  • Runtime Data Area
  • Garbage Collector

출처

profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글