JIT 컴파일러의 이해와 자바와 자바스크립트에서의 활용

2023. 4. 3. 16:41CS

728x90

JIT 컴파일러란?

JIT(Just-In-Time) 컴파일은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법입니다.

자바와 자바스크립트 모두 이 기법을 사용하지만,

두 언어의 동적 타입(dynamic type)과 정적 타입(static type) 특성에 따라 JIT 컴파일러가 다르게 작동합니다.

 

자바스크립트에서의 JIT 컴파일러 활용

반면, 자바스크립트는 동적 타입 언어입니다.

실행 전까지 변수나 함수에 넘겨지는 매개변수 같은 타입들에 대한 정보를   없습니다.

동적 타입 언어의 경우, 프로그램 실행 중에 변수의 타입이 변경될  있으므로,

실행 시점의 타입 정보를 활용하여 최적화 수행해야 합니다.

 

자바스크립트 엔진들은 이러한 동적 타입 언어의 특성을 고려하여

JIT 컴파일러를 사용하여 코드를 빠르게 실행할  있도록 최적화합니다.

자바에서의 JIT 컴파일러 활용

자바는 정적 타입 언어입니다.

이 말은 변수의 타입이 컴파일 시점에 결정되고, 실행 전에 이미 정해진다는 것을 의미합니다.

따라서 자바의 JIT 컴파일러는 컴파일 시점의 타입 정보를 활용하여 최적화를 수행할 수 있습니다.

 

좀 더 자세하게 풀어보겠습니다.

 

자바에서 프로그램이 실행되기 전에는 바이트코드로만 존재하고,

이를 JVM(Java Virtual Machine)에서 실행하기 위해서 기계어로 번역해야 합니다.

그렇지 않으면 프로그램은 실행할 수 없습니다.

 

위의 설명만 본다면 다음과 같은 의문이 떠오를 수 있습니다.

 

그럼 왜 미리 모든 바이트코드를 기계어로 번역하지 않고, 프로그램이 실행되는 시점에 JIT 컴파일러를 사용해서 번역하지..?

위 의문에 대한 답은 2가지로 설명할 수 있습니다.

1. 성능 최적화
JIT 컴파일러는 런타임 시점에 동적으로 최적화를 수행할 있습니다.

예를 들어, 어떤 메서드가 여러 호출된다면, JIT 컴파일러는 메서드를 기계어로 번역하고 캐싱하여
이후 호출에서 번역된 코드를 재사용합니다.
이렇게 하면 반복적인 번역 작업을 줄이고 실행 시간을 단축할 있습니다.

예를 들어, 자바에서 다음과 같은 반복문이 있다고 해봅시다.

for (int i = 0; i < 10000; i++) {
    ranMethod();
}

여기서 ranMethod()는 자주 호출되는 메서드입니다.

JIT 컴파일러를 사용하지 않으면, someMethod()가 호출될 때마다

바이트코드를 기계어로 번역하는 작업이 반복됩니다.

 

하지만 JIT 컴파일러를 사용하면, 처음 someMethod()가 처음 호출될 때만 바이트코드를 기계어로 번역하고,

이후 호출에서는 번역된 기계어 코드를 재사용하여 실행 시간을 줄일 수 있습니다.

 

결론적으로, 자바에서 JIT 컴파일러를 사용하는 이유는

주로 실행 시간을 줄이고, 런타임 중에 최적화를 수행하여 프로그램의 성능을 향상시키기 위한 것입니다.

 

2. 메모리 사용량 최소화
프로그램 전체를 미리 기계어로 번역한다면, 모든 코드가 메모리에 올라가게 됩니다.

이렇게 되면 사용하지 않는 코드도 메모리를 차지하게 되어 메모리 사용량이 불필요하게 증가합니다.

 

JIT 컴파일러를 사용하면 실제로 실행되는 부분만 기계어로 번역하고 메모리에 올리게 되므로,

메모리 사용량을 최소화 있습니다.

 

정리하자면,

자바의 JIT 컴파일러가 사용되는 이유는 런타임 중에 성능 최적화 수행하고, 메모리 사용량을 최소화하기 위해서입니다.

이를 통해 프로그램의 전반적인 성능을 향상시킬 있습니다.

 

 

728x90