Tina

자바 가상 머신 (JVM)

밍밍이

밍밍이

Sep 24, 2019

참고

https://asfirstalways.tistory.com/158

Class Loader

JVM 내로 클래스 파일을 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈이다. 런타임 시 동적으로 클래스를 로드한다. jar파일 내 저장되 클래스들을 JVM 위에 탑재하고 사용하지 않는 클래스들은 메모리에서 삭제한다.

Execution Engine

클래스를 실행시키는 모듈. Class Loader가 JVM 런타임 영역에 바이트 코드를 배치시킨 후 이는 실행 엔진에 의해 실핸된다. 이때 바이트 코드를 JVM 내부에서 기계가 실행할 수 있는 형태로 변환하는데 두 가지 방법을 사용한다.

Interpreter

한 줄 씩 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.

JIT

인터프리터는 인터프리터는 계속 실행하기엔 느리기 때문에 JIT가 도입되었다. 이 컴파일러는 적절한 시점에 실행되며 바이트코드 전체를 컴파일 하여 네이티브 코드로 변환하고 이 후 더 이상 인터프리팅 하지 않는다. 네이티브 코드는 캐시에 보관되기 때문에 빠르게 실행될 수 있다. 하지만 JIT는 인터프리터에 비해 당연히 오래걸리므로 JVM이 적절한 시점에서 JIT를 실행한다.

Runtime Data Area

프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간

PC Register

스레드가 시작될 때 생성되며 생성되는 공간으로 스레드 마다 하나씩 존재한다. 스레드가 어떤 부분을 어떤 명령으로 실행해야 할지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 갖는다.

JVM 스택 영역에

프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역. 각종 형태의 변수나 임시 데이터, 스레드나 메소드 정보를 저장한다. 메소드 호출 시 각각의 스택 프레임이 생성되고 수행이 끝나면 프레임 별로 삭제를 한다. 또한 메소드 내 로컬 변수, 매개변수, 지역변수, 리턴 값, 연산 시 일어나는 값들을 저장한다.

GC

참고

https://asfirstalways.tistory.com/159

Method Area

클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간. 자바는 메소드의 계속된 호출로 프로그램이 흘러가기 때문에 자바 내 거의 모든 바이트코드가 올라간다고 볼 수도 있다.

Runtime Constant Pool

상수 자료형을 저장하고 중복을 막는 역할을 한다.

Heap

객체를 저장하는 가상 메모리 공간. 물론 클래스 영역에 올라온 클래스들만 객체로 생성할 수 있다.

Permanent Generation

생성된 객체들의 정보의 주소값이 저장된 공간. 클래스 로더에 의해 로드되는 클래스, 메소드 등에 대한 메타 정보가 저장되는 영역이고 JVM에 의해 사용된다. Reflection을 사용하여 동적으로 클래스가 로딩되는 경우 사용된다. 내부적으로 Reflection 기능 자주 사용하는 Spring Framework를 이용할 경우 이 영역에 대한 고려가 필요.