- 자바 프로그램이 실행되는 흐름을 설명해 주세요.2025년 04월 09일 15시 38분 50초에 업로드 된 글입니다.작성자: do_hyuk728x90반응형
우리가 작성한 .java 파일은 JDK에 포함된 javac(java compiler) 를 통해 컴파일됩니다.
이 과정에서 JVM이 이해할 수 있는 바이트 코드로 변환되어 .class 파일이 생성됩니다.
이후부터는 JVM이 담당하는데요. 먼저 클래스 로더(Class Loader) 가 바이트 코드를 JVM 메모리에 동적으로 로드합니다.
로드된 바이트 코드는 Method Area에 저장되며, 이때 로딩(Loading), 링킹(Linking), 초기화(Initialization) 단계를 거칩니다.
그다음, 실행 엔진(Execution Engine) 이 로드된 바이트 코드를 실행합니다.
하지만 바이트 코드는 컴퓨터가 읽을 수 없기 때문에 인터프리터(Interpreter) 와 JIT 컴파일러(Just-In-Time Compiler) 를 함께 사용하여 기계어로 변환합니다.
인터프리터는 바이트 코드를 한 줄씩 읽어서 실행하는 방식이고, JIT 컴파일러는 자주 실행되는 메서드(Hotspot)를 감지하면 해당 메서드 전체를 네이티브 코드로 변환하여 캐싱합니다.
클래스 로더가 바이트 코드를 동적으로 로드한다는 것은 무슨 의미인가요?
프로그램이 시작될 때 모든 클래스를 한꺼번에 로드하는 것이 아니라, 런타임 시점에 필요한 클래스만 로드하는 것을 의미합니다.
클래스 로드는 인스턴스를 생성할 때, static 메서드나 변수를 사용할 때, static 변수에 값을 할당할 때 이루어집니다.
이러한 동적 로드 방식은 불필요한 클래스 로드를 방지하여 메모리를 효율적으로 사용할 수 있습니다.
로딩, 링킹, 초기화 단계가 무엇인가요?
로딩(Loading) 은 클래스 로더가 .class 파일을 읽어 JVM 메모리에 로드하는 단계입니다. 로드된 클래스는 Method Area에 저장됩니다.
링킹(Linking) 은 로드된 클래스가 실행될 수 있도록 준비하는 단계이며 세 가지의 과정으로 이루어집니다.
- Verification: .class 파일이 구조적으로 올바른지 확인합니다.
- Preparation: static 변수를 메모리에 할당하고 기본값으로 초기화합니다.
- Resolution: 런타임 상수 풀에 있는 심볼릭 레퍼런스를 실제 메모리 레퍼런스로 교체합니다.
초기화(Initialization) 는 static 변수를 사용자가 지정한 값으로 초기화하고 static 블록을 실행하는 단계입니다.
실행 엔진이 바이트 코드를 기계어로 변환할 때 인터프리터와 JIT 컴파일러를 함께 사용하는 이유는 무엇인가요?
인터프리터는 바이트 코드를 한 줄씩 읽어서 실행하는 방식이기 때문에 초기 실행 속도가 빠릅니다.
하지만 같은 코드가 반복적으로 실행될 경우 매번 해석해야 해서 성능이 저하되는 단점이 있습니다.
초기 JVM은 인터프리터만 사용했지만, 이러한 단점을 보완하기 위해 JIT 컴파일러가 도입되었습니다.
JIT 컴파일러는 자주 실행되는 메서드를 네이티브 코드로 변환하여 캐싱합니다.
이렇게 변환된 코드는 반복 실행 시 인터프리터보다 훨씬 빠르게 실행됩니다.
하지만 JIT 컴파일 과정 자체에 시간이 소요되기 때문에 초기 실행 시 오버헤드가 발생할 수 있습니다.
따라서 JVM은 두 방식을 함께 사용하여 초기 실행 속도와 높은 반복 실행 성능을 동시에 달성할 수 있습니다.
728x90반응형'면접 대비' 카테고리의 다른 글
방어적 복사에 대해서 설명해주세요. (0) 2025.04.17 Call By Value와 Call By Reference에 대해서 설명해주세요. (0) 2025.04.16 교착 상태에 대해서 설명해주세요. (0) 2025.04.01 Redis가 싱글 스레드로 만들어진 이유를 설명해주세요. (0) 2025.03.28 JWT 특징과 주의 사항을 설명해주세요. (0) 2025.03.27 댓글