본문 바로가기

Language/Java

[Java] JVM 메모리 구조

JVM이란?

JVM은 "Java Virtual Machine"을 줄인 것으로 "자바를 실행하기 위한 가상 기계"라고 할 수 있으며 자바 가상 머신이라고 부른다. 그리고 자바와 운영체제 사이에서 중개자 역할을 수행하며 자바가 운영채제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와준다.

 

자바 프로그램 실행 단계

Java애플리케이션과 일반 애플리케이션의 비교


 

그렇다면 이제는 JVM이 어떻게 동작하는지와 구조에 대해 알아보자.

JVM의 구조는 크게 Class Loader, Exceution Engine, Runntume Data Area, Garbage Collector로 4가지로 나눌 수 있다. 밑에 그림은 JVM의 메모리 구조이다.

 

JVM의 메모리 구조

 

 

 

Class Loader

JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다. 런타임 시에 동적으로 클래스를 로드한다.

Exceution Engine

Class Loader를 통해 JVM 내의 Runtime Data Area의 Method Area에 배치된 바이트 코드들을 명렁어 단위로 읽어서 실행한다. JVM은 Method Area의 바이트 코드들을 Excetion Engine에 제공하여 Class에 정의된 내용대로 바이트 코드를 실행시킨다. 

Garbage Collector

Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다. 이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없다.

Runtime Data Area

JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.

이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있다.


 

이제 한 단계 더 들어가서 Runtime Data Area에 대해서 알아보자.

 

Runtime Data Area(Memory Area)

1.메소드 영역(Method Area)

프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)를 읽어서 분석하여 클래스에 대한 정보를 이곳에 저장한다. 즉 클래스 정보, 인터페이스, static 변수, 변수 정보, 메소드 정보 등을 저장한다.

 

2.힙 영역(Heap Area)

인스턴스가 생성되는 공간(new 키워드로 생성된 객체와 배열이 생성되는 영역), 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉 인스턴스 변수들이 생성되는 공간이다. 또한 Garbage Collector 가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.

 

3.스택 영역(Stack Area)

메소드 호출 시에 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 등 연산 시 일어나는 값들을 저장하는 영역이다. 메서드의 수행이 끝나면 제거된다.

 

4. PC Register

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

 

5. Native method stack

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.