java 가상머신으로 java 바이트 코드를 실행할 수 있는 주체이다
하나씩 살펴보자
예를들어 자바에서 코딩시 a.java 파일이 생성된다고 하면
.java 소스를 자바컴파일러(javac)가 컴파일하여 a.class같은 클래스 파일(바이트코드)로 변환해준다
class Loader는 이러한 class파일들을 모아서 JVM이 운영체로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할을 한다
Execution Engine은 Class Loader에 의해 메모리에 적재된 클래스(바이트코드)들을 기계어로 변경해 명령어 단위(operation Code)로 실행하는 것을 말한다. 명령어단위 실행에는 2가지 방식이 있다.
인터프리터 방식 : 명령어를 하나씩 수행(기본적인 방식. 전체 수행은 느리나 명령어 하나씩의 동작은 빠름)
JIT(Just In Time compiler)방식 : 전체 바이트 코드를 네이티브 코드로 변환하고 그 이후에는 인터프리팅하지 않고 네이티브 코드 상태로 실행(전체적인 동작은 빠르나 컴파일하는데 상당 시간 소요)
Garbage Collector(GC)는 Heap 메모리 영역에 생성된 객체들 중에 참조되지 않은 객체들을 제거하는 역할을 한다. GC의 동작시간은 일정하게 정해져 있지 않기 때무에 언제 객체를 정리할지는 알 수 없다. 즉 바로 참조가 없어지자마자 작동하는것이 아니라는 것이다
또한 GC를 수행하는 동안 GC Thread를 제외한 다른 모든 Thread는 일시정지상태가 된다.
특히 Full GC가 일어나서 수초간 모든 Thread가 정지한다면 심각한 장애로 이어질 수 있다
JVM의 메모리 영역으로 자바 애플리케이션 실행시 사용되는 데이터를 적재하는 영역이다.
크게 5가지 영역으로 구분된다.
1. Method Area
필드 정보(클래스 멤버 변수명, 데이터 타입, 접근 제어자 정보)
메소드 정보(메소드명, 리턴 타입, 접근 제어자 정보)
Type 정보(Interface인지 Class인지)
Constant Pool(상수 풀: 문자 상수, 타입, 필드, 객체 참조 저장)
static 변수
final 클래스 변수
2. Heap Area
new 키워드로 생성된 객체와 배열이 생성되는 영역
Method Area에 로드된 class만 생성 가능하며 GC가 참조되지 않은 메모리를 확인하고 제거하는 영역
3. Stack Area
지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시값 등을 저장
int a = 10 을 예로 들면 정수값이 할당될 수 있는 메모리 공간을 a라고 잡아두고 그 메모리 영역에 10을 넣는다.
클래스 A a = new A()의 경우 A a는 스택영역에 저장되고 new로 생성된 A클래스의 인스턴스는 Heap영역에 생성된다.
또한 스택영역에 생성된 a는 힙영역의 주소값을 가지고 있다. 즉 a가 heap영역에 생성된 객체를 가리키며 참조하고 있다.
메소드 호출시마다 개별적으로 스택이 생성된다.
4. PC Register
Thread가 생성될 때마다 생성되는 영역으로 Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다. 이것을 이용해 쓰레드를 돌아가면서 수행한다
5. Native Method Stack
자바외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다
보통 C/C++등의 코드를 수행하기 위한 스택이다 (JNI)
스레드 생성시 Method, Heap영역을 모든 스레드가 공유하고,
stack, PC Register, Native Method Stack은 각각의 스레드마다 생성되고 공유되지 않는다
참조 URL : https://jeong-pro.tistory.com/148