본문 바로가기
JAVA

[JAVA] JVM 메모리 구조

by A Coder's Daydream 2024. 10. 15.
SMALL

JVM이란?

JVM(Java Virtual Machine)은 자바 코드를 실행하기 위한 가상의 컴퓨터

 

JVM의 동작 방식

1. .java라는 확장자로 되어 있는 소스 코드를 컴파일하면 .class라는 확장자를 가진 파일(바이너리 파일)이 생성되어 디스크에 저장된다. 컴파일을 하는 프로그램을 컴파일러라고 부르며, 자바에서는 javac.exe라는 프로그램(리눅스에서는 javac)이 그 역할을 수행한다.

2. 컴파일을 마친 클래스 파일(.class)은 JVM의 클래스 로더에 의해 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area에 로드된다. 클래스 로더는 런타임 상태일 때 클래스 파일을 동적으로 적재한다.

3. Runtime Data Area에 로드된 클래스 파일은 Execution Engine에서 실행된다.

 

클래스 로더

클래스 로더(Class Loader)는 JVM 내로 클래스 파일(.class)을 동적으로 로드하고, 링크를 통해 배치하는 작업을 수행한다. 

 

런타임 데이터 영역

런타임 데이터 영역(Runtime Data Area)은 JVM의 메모리 영역으로 자바 프로그램을 실행할 때 사용되는 데이터들을 적재하는 영역이다.

Runtime Data Area 구성요소

1. Method Area (Class Area, Static Area)

JVM이 시작될 때 생성되는 공간으로 바이트 코드(.class)를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이다. 모든 쓰레드가 공유하는 영역이다.

JVM이 동작하고 클래스가 로드될 때 적재되서 프로그램이 종료될 때까지 저장된다. (명시적으로 null 선언시 GC 대상)

 

다음의 정보들이 저장된다.

 

 ① Type Info : 클래스와 인터페이스의 정보     

      - Type 이름(Symbolic reference) : 패키지명을 포함한 클래스 이름

      - Type 종류 : Class 혹은 Interface

      - Type의 제어자 : 접근 제어자(public, private 등), 기타제어자(abstract, final 등)

      - 연관된 Interface 정보 : Class에 사용된 Interface의 정보

 

 ② Field Info : 인스턴스 변수의 정보

      - Type명 : 인스턴스 변수의 타입

      - Type의 제어자 : 접근 제어자(public, private 등), 기타제어자(abstract, final 등)

 

 ③ Method Info : 메소드의 모든 정보

      - Method명

      - Method return type

      - Method parameter 수와 각 parameter의 type 정보

      - 필요한 메소드에 대한 정보들


 ④ Runtime Constant Pool
 : Type의 상수 정보를 저장하며, 인덱스를 통해 접근이 가능하다.

      - 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 Reference를 저장한다.

      - JVM은 이 Constant Pool을 통해 해당 메소드와 필드의 실제 메모리상의 주소를 찾아 참조한다.

      - Method Area에 클래스의 정보가 올라오면 Constant Pool에 대한 포인터를 하나 생성하여 언제든지 클래스 내의 상수에 

        대한 접근이 가능하다. (중복을 막음)

 

 

2. Heap

JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.

즉, new 연산자를 통해 동적으로 생성되는 인스턴스 객체가 저장되며, 그 Reference를 Stack에 저장한다. (Heap에 있는 인스턴스에 접근하기 위해 Stack에 저장된 Reference를 통해 접근이 가능하다.)

모든 쓰레드가 공유하며, GC 대상이 되는 영역이다.

 

 

3. Stack

스택 영역은 int, long, boolean 등 기본 자료형을 생성할 때 저장하는 공간으로, 임시적으로 사용되는 변수나 정보들이 저장되는 영역이다.

 

메소드 호출 시마다 각각의 스택 프레임(그 메소드만을 위한 공간)이 생성되고 메소드 안에서 사용되는 값들을 저장하고, 호출된 메소드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다. 메소드 수행이 끝나면 프레임별로 삭제된다.

 

단, 데이터의 타입에 따라 Stack과 Heap에 저장되는 방식이 다르다.

 

 ① 기본(원시)타입 변수는 Stack 영역에 직접 값을 가진다.

 ② 참조타입 변수는 Heap 영역이나 메소드 영역의 객체 주소를 가진다.

 ③ 피연산값과 계산과정에서 생기는 중간값을 저장한다. (JVM은 Stack 기반의 연산을 수행함)

 

만약 쓰레드가 사용할 수 있는 스택의 크기를 넘기게 되면 StackOverflowError가 발생한다.

스택을 동적으로 확장할 때 확장할 메모리가 부족하거나 새로운 쓰레드 생성 시 스택에 할당할 메모리가 부족하면 OutOfMemoryError가 발생한다.

 

 

4. PC Register

PC Register는 쓰레드가 시작될 때 생성되며, 현재 수행중인 JVM 명령어 주소를 저장하는 공간이다.

즉, 현재 실행 중인 작업을 CPU에게 전달하기 위해 사용되는 작은 메모리 공간이다.

 

PC Register는 자바 프로그램이 어떤 작업을 하고 있는지, 그리고 다음에 어떤 명령어를 CPU가 처리해야 하는지를 기억하는 역할을 한다. 즉, PC Register는 CPU에게 작업 순서를 알려주는 역할을 한다.

 

만약, 자바가 아닌 다른 언어의 메소드를 수행하고 있다면, undefined 상태가 된다. (자바에서는 이 두 경우를 따로 처리한다.)

이에 대한 처리는 Native Method Stack에서 담당한다.

 

 

5. Native Method Stack

Native 언어(C, C++, 어셈블리 등)로 작성된 코드를 실행하기 위한 메모리 영역이다.

'JAVA' 카테고리의 다른 글

[JAVA] 접근 제어자  (0) 2024.10.22
[JAVA] 패키지  (2) 2024.10.22
[JAVA] 메소드 오버로딩  (0) 2024.10.20
[JAVA] 배열  (0) 2024.10.20
[JAVA] String Constant Pool  (0) 2024.10.15