본문 바로가기

자바(JAVA)/기본 문법

JAVA 자바 메모리 구조(Runtime Data Area)

JAVA 참조 타입 (reference type)

- 자바에서 지원하는 데이터 타입은 크게 두가지로 분류될 수 있다.

기본 타입(primitive type) : 정수타입(byte, char, short, int, long), 실수 타입(float, double), 논리 타입(boolean)

참조 타입(reference type) : 배열 타입, 열거 타입, 클래스, 인터페이스

 

- 참조 타입이란 객체(Object)의 번지를 참조하는 타입을 말한다.

- 기본 타입을 이용하여 선언된 변수는 실제 값을 변수 안에 저장하지만 참조 타입을 이용해서 선언된 변수는 메모리의 번지를 값으로 갖게 된다.

 

 

JAVA 참조 타입은 메모리의 번지를 값으로 사용하기 때문에 JAVA 메모리 구조에 대해 알아볼 필요가 있다!

 

 

JAVA 메모리 구조(Runtime Data Area)

 

 

JVM은 Class Loader, Runtime Data Areas, Excution Engine 영역으로 구성된다.

 

Class Loader

- Runtime 시점에 클래스를 로딩하게 해주며 클래스의 인스턴스를 생성하면 Class loader를 통해 메모리에 로드하게 됨

 

Runtime Data Areas

- JVM이 프로그램을 수행하기 위해 OS(운영체제)로부터 할당 받은 메모리 영역으로 크게 5가지 영역으로 나뉘어짐

 

  • Method Area(메소드 영역) : JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다. 코드에서 사용되는 클래스(~.class)들을 Class Loader로 읽어 클래스별로 런타임 상수풀, 필드 데이터, 메소드 데이터, 메소드 코드, 생성자 코드 등을 분류하여 저장한다. 
  • Heap(힙 영역) : 객체와 배열이 생성되는 영역으로 프로그램 상에서 런타임시 동적으로 할당하여 사용하는 영역이다. class를 이용하 instance를 생성하면 Heap영역에 저장된다. (ex. ClassA a = new ClassA();)
  • JVM Stack(스택 영역) : JVM 스택 영역은 각 스레드가 하나씩 존재하며 스레드가 시작될 때 할당된다. 자바 프로그램에서 추가적으로 스레드를 생성하지 않았다면 main 스레드만 존재하므로 JVM 스택도 1개가 된다. JVM 스택은 메소드를 호출할 때마다 Frame을 통해서 저장되고 메소드가 종료되면 해당 Frame을 제거하는 동작을 수행한다. 모든 지역변수가 저장되는 영역이다.
  • Native Method Stack : Java 외의 언어로 작성된 네이티브 코드들을 위한 Stack, 즉 JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 Stack이다.
  • PC Register : Java의 PC Register는 스레드별로 하나씩 존재하며 현재 수행중인 JVM Instruction의 주소를 가지게 된다.

Excution Engine

- Load된 클래스의 바이트코드를 실행하는 Runtime Module이다.Class loader를 통해 JVM 내의 Runtime Data Areas에 배치된 바이트코드는 Excution Engine에 의해 실행되며, 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.