[질문]
- Java JVM의 클래스로더는 어떤 역할은 하는 것인지 설명하고, 하위 세 단계들에 대해서 핵심만 간단히 설명해주세요.
- Java JVM의 실행엔진에서 인터프리터와 JIT 컴파일러에 대해서 간단하게 설명해주세요.
- Java JVM의 “STOP-THE-WORLD” 현상은 어떻게 발생하게 되는지 설명해주세요.
- 클래스 로더는 Java code가 컴파일된 .class 파일을 JVM으로 처음 로드하여, 컴퓨터가 JVM의 실행하기 직전 준비를 진행하는 녀석입니다. 클래스 로더는 각각 3가지 단계( 로딩, 링크, 초기화 )를 진행합니다.
- 로딩은 클래스 파일을 Method Area에 저장하는 단계인데, 이 중 Static 변수와 초기값 Method Area에 저장한다.
- 링크는 클래스 파일 사용전 검증하느 과정인데, 검증/준비/분석 단계를 진행합니다.
- 초기화는 static 변수와 staic block의 실행을 수행합니다. (참고: 이 초기화 단계는 코드에서 클래스가 처음 사용될 때 실행됩니다. )
- JVM 실행엔진은 실제 바이트 코드를 수행하는 역할을 진행하는 것입니다. 인터프리터가 바이트 코드를 한 줄씩 해석하여 컴퓨터가 실행하게 합니다. ( 실시간 통역 ) JIT 컴파일러는 빈번하게 사용되는 코드를 식별하여 기계어로 변환하여 실행합니다. ( 메모 )
- Java 코드 실행하다보면 heap 영역에 더 이상 쓰이지 않는(= Unreable 상태) 객체가 나타납니다. JVM 내부 GC는 이 객체를 주기적으로 없애서 Heap 사용을 최적화하려 합니다. GC 는 이 unreachable 객체들을 Mark-Sweep-Compaction 순서로 청소합니다. 이 과정에서 가끔씩 넓은 영역인 Old Generation을 청소할 때가 있습니다. 이걸 Major GC라고 부르며, 이 Major GC가 일어날 때 Java의 Thread 동작이 일시정지하여 짧은시간 Java 애플리케이션이 느려지게 되는 ”STOP_THE_WORLD” 현상이 일어납니다.
- Java 컴파일러 개발자가 아닌, Java 백엔드 개발자를 지향하는 관점에서 클래스 로더에서 좀 더 집중해야할 부분은 이 단계에 static 변수와 함수가 실행된다는 것입니다.
- JVM의 JIT 컴파일러를 잘 사용하게 되면 전체적으로 Java 코드 성능이 올라갑니다. 정말 성능이 중요한 실제 실무에서는 JIT 컴파일러까지 고려하기도 하니 기억해두면 도움됩니다.
- JVM GC 부분은 수업시간에 중요하다고 말씀드려서 따로 추가 코멘트 없습니다.