Java

[Java] 자바 컴파일 - 자바의 실행 과정(Java Compiler, JVM)

Da-ryu 2022. 4. 28. 22:22

자바 소스코드(exmple.java) 실행 과정

- Java Compiler

1. 자바 소스코드(*.java)는 자바 컴파일러(javac)에 의해 바이트 코드로 변환(*.class)된다.

 바이트 코드는 운영체제에서 직접 읽을 수 있는 코드가 아닌 JVM(자바 가상 머신, Java Virtual Machine)이 읽을 수 있는 코드이다. 따라서 자바의 실행 파일은 바이트 코드 형식으로 변환된 class 파일이며 이 파일을 실행시키는 건 JVM이 된다.

 C나 C++은 소스파일이 컴파일러에 의해 바이너리 파일로 변환된다. 이때 바이너리 코드로 변환된 실행 파일은 특정 운영체제에서만 접근할 수 있어서 운영체제가 바뀌면 각 운영체제에 맞게 소스코드를 수정하고 다시 컴파일해야 하는 어려움이 있다. 반면 자바는 JVM을 통해 모든 운영체제에서 코드의 수정 없이 사용 가능하여 플랫폼에 독립적이라는 큰 장점이 있다. 이는 자바의 구현 정신("Write Once, Use Anywhere")과 이어진다.

- JVM

2. JVM의 클래스 로더(Class Loader)는 바이트 코드를 클래스가 요청될 때 파일로부터 읽어 JVM 메모리(즉 런타임 데이터 영역(Runtime Data Area))에 올린다.

 필요한 시점에 클래스를 로딩하여 사용하기 때문에 동적 로딩이라고 한다. 동적 로딩은 일부 클래스가 변경되어도 전체 애플리케이션을 다시 컴파일하지 않아도 되기 때문에 유연하게 처리할 수 있다는 장점이 있다.

 

3. JVM의 실행 엔진(Execution Engine)은 JVM 메모리 영역에 올라온 바이트 코드들을 실행한다.

 실행 시에는 바이트 코드를 하나씩 읽어서 해석하는 인터프리터(Interpreter) 방식을 사용한다. 이때 중복되는 코드들도 매번 컴파일을 하면 비효율적이기 때문에 반복되는 코드들은 JIT 컴파일러(Just-In-Time Compiler)를 사용하여 해석한다. 참고로 실행 엔진에는 Interpreter, JIT 컴파일러 외에 가비지 컬렉션(Garbage Collection)이 있다. 가비지 컬렉션은 런타임 데이터 영역의 Heap 영역에서 더 이상 사용될 수 없거나 참조되지 않는 객체를 메모리에서 제거하는 역할을 한다.