프로그래밍 언어/JAVA

자바 메모리 구조 설명(RunTime Data Area)

Minerva579 2024. 10. 10. 18:24
반응형

 

 

오늘은 자바의 런타임 데이터 에리어에 관한 포스팅이다.

 

먼저, RunTime Data Atea란

JVM(Java Virtual Machine)이 프로그램을 수행하기 위해서 운영체제(OS)로부터

할당받은 메모리 영역이다.

 

프로그램이 실행되면 메모리를 할당 받는다.(JVM의 검은 네모? 영역)

 

 

위 그림 왼쪽의 자바 소스 파일에서 자바 컴파일러를 통해 컴파일 단계에서

Byte Code로 변환된다.

 

이는 JVM이 이해하고 실행할 수 있도록 변환 해주는

중간 코드이다.

 

이렇게 바이트 코드 즉, java class file로 변환 되었다면

이 개발자가 직접 작성한 소스 .class 파일이 JVM에서 실행이된다.

 

추가적으로 Run Time area의 오른쪽 맨 아래 위치한

Java API's class files는 Java 표준 라이브러리에서 제공하는

클래스 파일로 여러 기본 기능을 제공하는 클래스를 포함해준다.

 

즉, 이 표준 라이브러리에서 제공하는 클래스 파일은

Java에서 제공하는 것으로 개발자가 직접 작성해서

바이트 코드로 변환 된 소스코드가 아닌 것이다.

 

그리고 이렇게 JVM이 운영체제(OS)로부터 받은 메모리 영역은

아래와 같이 구성되어 있다.

 

1. 메모리를 할당 받은 JVM의 메모리 영역 구성도

 

2. 상세 공간 구성도

출처 : (https://hongsii.github.io/2018/12/20/jvm-memory-structure/)

 

 

- 예시 설명 -

1. Class Loader Subsystem

 

- 역할: Java 클래스 파일을 메모리에 로드하여 JVM이 사용할 수 있도록 함.

- 쉽게 설명 :  사용자가 만든 클래스를 JVM이 알아볼 수 있도록 가져오는 역할.

- 데이터 예시: MyClass.class (사용자가 정의한 클래스)

- 흐름: MyClass.class → JVM 로드 → 메모리에 배치

 

2. Execution Engine

-  역할: JVM에서 바이트코드를 실행하는 엔진.

-  쉽게 설명 :  프로그램이 실제로 작동하게 만드는 엔진.

-  데이터 예시: 0x12345678 (바이트코드)

-  흐름: 바이트코드 0x12345678 → 해석 → 기계어로 변환 → 실행

 

3. PC Registers (개별 스레드 메모리 공간 존재)

-  역할: 현재 실행 중인 스레드의 바이트코드 주소를 기억.

-  쉽게 설명 :  지금 실행 중인 코드를 추적하는 주소 기억.

-  데이터 예시: 0xABCD (현재 메서드의 주소)

-  흐름: 메서드 호출 → PC 레지스터 업데이트 → 다음 바이트코드 주소로 이동

 

4. Java Virtual Machine Stacks (개별 스레드 메모리 공간 존재)

-  역할: 메서드 호출 시 로컬 변수와 중간 결과 저장.

-  쉽게 설명 : 메서드에서 사용하는 변수와 결과를 저장하는 곳!

-  데이터 예시: int x = 10; (로컬 변수)

-  흐름: 메서드 호출 → 스택 프레임 생성 → 로컬 변수 x 저장

 

5. Method Area

-  역할: 클래스와 메서드의 메타데이터 저장.

-  쉽게 설명 : 클래스와 메서드에 대한 정보를 보관하는 장소

-  데이터 예시: public static int myVar = 0; (클래스 변수)

-  흐름: 클래스 로딩 → 메서드 정보 저장 → 접근 준비

 

6. Heap

-  역할: 객체와 배열을 동적으로 할당.

-  쉽게 설명 : 프로그램이 사용할 객체와 배열을 저장하는 큰 공간

-  데이터 예시: MyObject obj = new MyObject(); (객체 인스턴스)

-  흐름: new MyObject() → 힙에 객체 할당 → 참조 저장

 

7. Native Method Stacks (개별 스레드 메모리 공간 존재)

-  역할: 네이티브 메서드 호출 관련 데이터 저장.

-  쉽게 설명 : 다른 언어로 작성된 메서드를 처리하는 공간.

-  데이터 예시: native void myNativeMethod(); (네이티브 메서드)

-  흐름: 네이티브 메서드 호출 → 스택 프레임 생성 → 매개변수 저장

 

근데.. 그냥 컴파일 언어들은 바이트 코드로 변환되고 이게 런타임 환경에서 실행된다 정도만 알면 될 듯! 

반응형

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

접근 제어 지시자  (0) 2024.10.11
생성자(constructor)  (3) 2024.10.10
클래스(class)  (0) 2024.10.08
객체 지향(OOP)의 특징  (0) 2024.10.04
객체 지향 프로그래밍(OOP, Object-Oriented Programming)  (2) 2024.10.04