JVM 구조
크게 Class Loader, Runtime Data Area, Execution Engine, GC(Garbage Collector)로 나누어 집니다.
- Class Loader : 소스코드에서 컴파일한 '자바 바이트코드'인 .class 파일을 JVM 메모리 영역(Runtime Data Area)에 적재
- Runtime Data Area(JVM 메모리 영역) : 자바애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
- Execution Engine : Class Loader에 의해 메모리에 각각 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행
- GC(Garbage Collector) : Heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할
JVM 참고하기
> JVM 구조
- Class Loader
- .java 파일을 javac 컴파일러로 컴파일 하게 되면 .class 파일인 바이트 코드가 생김
- 이렇게 생성된 클래스 파일들을 엮어서 JVM으로 부터 할당받은 메모리 영역인 Runtime Data Area로 각각 적재 하는 역할
- Execution Engine
- Class Loader에 의해 메모리에 각각 적재된 클래스들을 기계어로 변경해 명령어 단위로 실행
- 명령어를 하나하나 실행하는 인터프리터 방식이 있고
- JIT 컴파일러를 이용하는 방식이 있음
- JIT 컴파일러는 적절한 시간에 전체 바이트 코드를 네이티브 코드로 변경해서 Excution engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식
- Runtime Data Area
- JVM의 메모리 영역으로 자바애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
- 실행 시 클래스 데이터와 같은 메타 데이터와 실제 데이터가 저장되는 곳
- Garbage Collector(GC)
- Heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할
- GC는 언제 일어날지 모르며, GC가 수행하는 동안 다른 모드 쓰레드가 일시정지하는 STW(Stop the World)가 발생
> Runtime Data Area(JVM 메모리 영역)
![](https://velog.velcdn.com/images/thsruddl77/post/67c00f2b-b99a-42e3-b9f9-07fdb26db50d/image.png)
Method Area와 Heap은 모든 쓰레드가 공유하는 영역
- 따라서 멀티 쓰레드 프로그래밍을 할 때 동기화에 주의해야하는 영역
- Method Area
- 클래스에 대한 정보가 저장되는 영역
- 클래스 정보를 처음 메모리에 올릴 때 초기화되는 대상을 저장하기 위한 영역
- 올라가는 정보
- Field Information
- 멤버 변수에 대한 정보(이름, 타입, 접근 제어자 등)
- Method Information
- 메서드에 대한 정보(이름, 리턴 타입, 파라미터, 접근 제어자 등)
- Type Information
- Class인지 Interface인지, Type 속성, 이름, super class 이름 등
- 상수형을 저장하고 중복을 막는 Runtime Constant Poll이 존재
- static 변수, final Class 변수 등
- Heap
- 객체를 동적으로 생성하게 되면 인스턴스가 Heap 영역의 메모리에 할당
- new 연산으로 생성된 객체와 배열이 저장되는 영역
- 메서드 영역에 로드된 클래스만 생성이 가능
- GC가 참조되지 않는 메모리를 확인하고 제거하는 역할
예시) Person p = new Person("사용자", 29);
- 변수 p는 Stack 영역에 저장되고 동적으로 생성한 객체 Person("사용자",29)는 Heap 영역에 저장됨
- 기본 타입이 아닌 참조 타입인 경우 Stack 영역이 아닌 Heap 영역에 메모리 저장
- 그 메모리에 주소를 참조하는 변수를 Stack 영역에 저장
Stack과 PC Registers와 Native Method Stacks는쓰레드마다 하나씩 생성되는 공간
- Java Stack
- 메서드를 실행하기 위한 정보가 저장되는 영역
- 지역변수, 파라미터, 리턴값 연산에 사용되는 임시 값 등이 저장되는 영역
- Java Stack 안에 frame이라는 자료구조가 들어감
- frame은 메서드가 하나 호출될 때마다 새로 생기고 메서드가 끝나거나 에외가 터지면 사라짐
- PC Registers
- 쓰레드가 생성될 때마다 생성되는 영역
- JVM은 스택 기반의 가상 머신으로, CPU에 직접 접근하지 않고 Stack에서 주소를 뽑아서 가져옴
- 현재 어떤 명령을 실행해야 할 지에 대한 기록 담당
- Program Counter로, CPU에 있는 레지스터와 다름
- 자바 프로그래밍 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행 시키는 영역
- Native Method Stacks
- 자바외 언어로 작성된 네이티브 코드를 위한 메모리 영역
- 자바외 언어에 제공되는 메서드의 정보가 저장되는 공간
- Java Native Interface를 통해 바이트 코드로 저장
- Kernel이 자체적으로 Stack을 잡아 독자적으로 프로그램을 실행시키는 영역
참고