참고
https://asfirstalways.tistory.com/158
JVM 내로 클래스 파일을 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈이다. 런타임 시 동적으로 클래스를 로드한다. jar파일 내 저장되 클래스들을 JVM 위에 탑재하고 사용하지 않는 클래스들은 메모리에서 삭제한다.
클래스를 실행시키는 모듈. Class Loader가 JVM 런타임 영역에 바이트 코드를 배치시킨 후 이는 실행 엔진에 의해 실핸된다. 이때 바이트 코드를 JVM 내부에서 기계가 실행할 수 있는 형태로 변환하는데 두 가지 방법을 사용한다.
한 줄 씩 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
인터프리터는 인터프리터는 계속 실행하기엔 느리기 때문에 JIT가 도입되었다. 이 컴파일러는 적절한 시점에 실행되며 바이트코드 전체를 컴파일 하여 네이티브 코드로 변환하고 이 후 더 이상 인터프리팅 하지 않는다. 네이티브 코드는 캐시에 보관되기 때문에 빠르게 실행될 수 있다. 하지만 JIT는 인터프리터에 비해 당연히 오래걸리므로 JVM이 적절한 시점에서 JIT를 실행한다.
프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간
스레드가 시작될 때 생성되며 생성되는 공간으로 스레드 마다 하나씩 존재한다. 스레드가 어떤 부분을 어떤 명령으로 실행해야 할지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 갖는다.
프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역. 각종 형태의 변수나 임시 데이터, 스레드나 메소드 정보를 저장한다. 메소드 호출 시 각각의 스택 프레임이 생성되고 수행이 끝나면 프레임 별로 삭제를 한다. 또한 메소드 내 로컬 변수, 매개변수, 지역변수, 리턴 값, 연산 시 일어나는 값들을 저장한다.
참고
https://asfirstalways.tistory.com/159
클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간. 자바는 메소드의 계속된 호출로 프로그램이 흘러가기 때문에 자바 내 거의 모든 바이트코드가 올라간다고 볼 수도 있다.
상수 자료형을 저장하고 중복을 막는 역할을 한다.
객체를 저장하는 가상 메모리 공간. 물론 클래스 영역에 올라온 클래스들만 객체로 생성할 수 있다.
생성된 객체들의 정보의 주소값이 저장된 공간. 클래스 로더에 의해 로드되는 클래스, 메소드 등에 대한 메타 정보가 저장되는 영역이고 JVM에 의해 사용된다. Reflection을 사용하여 동적으로 클래스가 로딩되는 경우 사용된다. 내부적으로 Reflection 기능 자주 사용하는 Spring Framework를 이용할 경우 이 영역에 대한 고려가 필요.