JVM 메모리 구조

태그
Java
날짜
2024/02/12
2 more properties

JVM이란

Java Virtual Machine의 약자.
각각 운영체제별 JVM을 설치한다면, Java 프로그램을 한 번 만들기만 하면 어느 운영체제에서든 실행할 수 있다. → 플랫폼 독립성, 운영체제에 종속적
가비지 컬렉션을 사용하여 메모리 관리를 자동으로 수행한다.

JVM 메모리 구조

JVM은 크게 4가지 구조로 이루어져 있다.
1.
Class Loader
JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치 하는 작업을 수행
로드 : 클래스 파일을 바이트 코드로 읽어 메모리로 가져오는 과정
링크 : 바이트 코드가 자바 규칙을 따르는지 검증, 클래스에 정의된 필드, 메소드, 인터페이스들을 나타내는 데이터 구조를 준비하며, 그 클래스가 참조하는 다른 클래스를 로딩한다.
클래스 파일을 분석한 뒤에 운영체제로부터 할당받은 Runtime Data Area에 적재.
2.
Runtime Data Area
JVM의 메모리 영역으로, 자바 애플리케이션을 실행할 때 사용되는 데이터를 적재하는 영역
a.
Method Area
b.
Heap Area
c.
Stack Area
d.
PC Register
e.
Native Method Stack
3.
Execution Engine
Runtime Data Area에 배치된 바이트 코드를 해석하며 실행.
이 때 인터프리터 방식과, JIT 컴파일 방식을 혼합하여 해석한다.
1.
인터프리터(Interpreter) 방식 : 바이트 코드를 한 줄씩 읽고 해석한다.
2.
JIT 컴파일(Just-In-Time compile) 방식 : 바이트 코드를 런타임 시점에 바로 기계어로 변환한다.
최초의 JVM은 인터프리터 방식만 사용하여 실행 속도가 느렸지만, JIT 컴파일 방식을 추가하여 이를 보완하고자 했다. 그런데 JIT 컴파일은 바이트코드를 기계어로 바꾸기 때문에 실행 속도가 빠르지만 변환하는 데 비용이 발생하게 된다. 그래서 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일 방식으로 실행한다.
4.
Garbage Collector
힙 메모리 영역에 생성된 객체들 중 더 이상 사용하지 않는 객체를 해제시켜 메모리를 반환한다.
Garbage Collector가 동작하는 시간은 언제인지 정확히 알 수 없다.

Runtime Data Area 메모리 영역

1.
Method Area
모든 쓰레드가 공유하는 메모리 영역.
Method Area는 클래스, 인터페이스, 메소드, 필드, static 변수 등의 바이트 코드를 보관.
2.
Heap Area
모든 쓰레드가 공유하는 메모리 영역.
new 키워드로 생성된 객체와 배열이 생성되는 영역.
Method area에 로드된 클래스만 생성이 가능하다.
Garbage Collector가 동작하는 영역
3.
Stack Area
메소드 호출 시마다 각각의 스택 프레임(그 메소드만을 위한 공간)이 생성됨.
그 메소드 안에서 사용되는 값들을 저장하고, 호출된 메소드의 매개변수, 지역변수, 리턴 값, 연산 시 일어나는 값들을 임시로 저장
메소드 수행이 끝나면 프레임별로 삭제됨
4.
PC Register
쓰레드가 시작될 때 생성되며, 쓰레드마다 하나씩 존재한다.
쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지 기록하는 부분
현재 수행중인 JVM명령의 주소를 갖는다.