답안
- 클래스 로더는 Java code가 컴파일된
.class
파일을 JVM으로 처음 로드하여,
컴퓨터가 JVM의 실행하기 직전 준비를 진행하는 녀석입니다.
클래스 로더는 각각 3가지 단계( 로딩, 링크, 초기화 )를 진행합니다.
- 로딩은 클래스 파일을 Method Area에 저장하는 단계인데,
이 중 Static 변수와 초기값 Method Area에 저장한다. ( Static 핵심입니다. 없으면 오답 )
- 링크는 클래스 파일 사용전 검증하느 과정인데, 검증/준비/분석 단계를 진행합니다.
- 초기화는 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 부분은 수업시간에 중요하다고 말씀드려서 따로 추가 코멘트 없습니다.