카테고리 없음

Java 클래스로더, 인터프리터, STOP-THE-WORLD

태영9922 2024. 7. 8. 13:46

[질문]

  1. Java JVM의 클래스로더는 어떤 역할은 하는 것인지 설명하고, 하위 세 단계들에 대해서 핵심만 간단히 설명해주세요.
  2. Java JVM의 실행엔진에서 인터프리터와 JIT 컴파일러에 대해서 간단하게 설명해주세요.
  3. Java JVM의 “STOP-THE-WORLD” 현상은 어떻게 발생하게 되는지 설명해주세요.

  1. 클래스 로더는 Java code가 컴파일된 .class 파일을 JVM으로 처음 로드하여, 컴퓨터가 JVM의 실행하기 직전 준비를 진행하는 녀석입니다. 클래스 로더는 각각 3가지 단계( 로딩, 링크, 초기화 )를 진행합니다.
  2. 로딩은 클래스 파일을 Method Area에 저장하는 단계인데, 이 중 Static 변수와 초기값 Method Area에 저장한다.
  3. 링크는 클래스 파일 사용전 검증하느 과정인데, 검증/준비/분석 단계를 진행합니다.
  4. 초기화는 static 변수와 staic block의 실행을 수행합니다. (참고: 이 초기화 단계는 코드에서 클래스가 처음 사용될 때 실행됩니다. )
  5. JVM 실행엔진은 실제 바이트 코드를 수행하는 역할을 진행하는 것입니다. 인터프리터가 바이트 코드를 한 줄씩 해석하여 컴퓨터가 실행하게 합니다. ( 실시간 통역 ) JIT 컴파일러는 빈번하게 사용되는 코드를 식별하여 기계어로 변환하여 실행합니다. ( 메모 )
  6. 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 부분은 수업시간에 중요하다고 말씀드려서 따로 추가 코멘트 없습니다.