What I Learned
호눅스의 강의 on JVM
JVM
JVM는 자바코드를 해석해서 실행시킨다. WORA(Write Once Run Anywhere)이라는 컨셉을 토대로 만들어졌는데 자바 코드는 한 번 쓰여지면 자바가 실행 가능한 시스템에서는 수정없이 어디서나 실행 가능하다. JVM은 크게 ClassLoader Subsystem, Runtime Data Area 그리고 Execution Engine 이렇게 세 부분으로 나뉜다.
ClassLoader Subsystem
동적으로 클래스가 로딩되는 부분을 여기서 맡고있다. 기능은 크게 세 가지로 나뉜다.
- Loading: 클래스정보(FQCN, 클래스이름, 부모클래스, 메소드와 변수의 정보 등) 메모리를 로딩한다.
- Linking: 생성된 bytecoder가 제대로 된 바이트코드인지 검사하고 검사에 실패할 시 verification error를 띄운다. 정적변수에 대한 메모리가 할당되고 기본값이 할당된다. 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.
- Initialization: 정적변수를 초기값으로 저장하고 static block을 실행시킨다.
Runtime Data Area
- Method Area: 정적변수를 포함한 클래스의 데이터가 저장된다. 한 JVM당 하나만 있으며 공유되는 자원이다.
- Heap Area: 만들어진 객체, 인스턴스 변수와 배열이 저장된다. 힙 또한 메소드 영역과 같이 하나만 있으며 공유되는 자원이다.
- Stack Area: 메소드의 호출이 여기서 만들어지며 메소드에서 사용되는 지역변수, 매개변수, 리턴값 등이 저장된다. 스레드의 개수만큼 생성된다.
- PC Register: JVM명령의 주소값이 저장된다. 스택영역과 같이 스레드의 개수만큼 생성된다.
Execution Engine
- Interpreter: 바이트코드를 해석한다. 단점은 메소드가 실행될 때마다 해석을 새로 한다.
- JIT Compiler: 한 번 실행되었던 메소드가 재호출될 때 기계어로 바꾸어주어 인터프리터의 단점을 줄여준다.
- Garbage Collector
기타