What I Learned

호눅스의 강의 on JVM

JVM

JVM는 자바코드를 해석해서 실행시킨다. WORA(Write Once Run Anywhere)이라는 컨셉을 토대로 만들어졌는데 자바 코드는 한 번 쓰여지면 자바가 실행 가능한 시스템에서는 수정없이 어디서나 실행 가능하다. JVM은 크게 ClassLoader Subsystem, Runtime Data Area 그리고 Execution Engine 이렇게 세 부분으로 나뉜다.

ClassLoader Subsystem

동적으로 클래스가 로딩되는 부분을 여기서 맡고있다. 기능은 크게 세 가지로 나뉜다.

  1. Loading: 클래스정보(FQCN, 클래스이름, 부모클래스, 메소드와 변수의 정보 등) 메모리를 로딩한다.
  2. Linking: 생성된 bytecoder가 제대로 된 바이트코드인지 검사하고 검사에 실패할 시 verification error를 띄운다. 정적변수에 대한 메모리가 할당되고 기본값이 할당된다. 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.
  3. Initialization: 정적변수를 초기값으로 저장하고 static block을 실행시킨다.

Runtime Data Area

  1. Method Area: 정적변수를 포함한 클래스의 데이터가 저장된다. 한 JVM당 하나만 있으며 공유되는 자원이다.
  2. Heap Area: 만들어진 객체, 인스턴스 변수와 배열이 저장된다. 힙 또한 메소드 영역과 같이 하나만 있으며 공유되는 자원이다.
  3. Stack Area: 메소드의 호출이 여기서 만들어지며 메소드에서 사용되는 지역변수, 매개변수, 리턴값 등이 저장된다. 스레드의 개수만큼 생성된다.
  4. PC Register: JVM명령의 주소값이 저장된다. 스택영역과 같이 스레드의 개수만큼 생성된다.

Execution Engine

  1. Interpreter: 바이트코드를 해석한다. 단점은 메소드가 실행될 때마다 해석을 새로 한다.
  2. JIT Compiler: 한 번 실행되었던 메소드가 재호출될 때 기계어로 바꾸어주어 인터프리터의 단점을 줄여준다.
  3. Garbage Collector

기타