Programing Language/Java

[Java] 자바 프로그램 메모리 구조(Java Program Memory Structure)

vinedpillar 2022. 5. 11. 13:14

자바 프로그램 실행 구조

 

 

 

메모리의 구분

  • 프로그램이 작동하기 위해서는 메모리(RAM)에 프로그램이 적재되어야 합니다.

  • 또한 프로그램 실행 중에 메모리에 데이터가 오르고 내리는 과정을 반복하게 됩니다.

  • 이러한 작업을 효율적으로 활용하기 위해 내부를 물리적, 논리적으로 구분하여 사용합니다.

  • 자바 프로그램에서는 JVM을 통해 위 그림과 같이 메모리의 영역을 구분하여 사용합니다.
    • 클래스 영역 / 힙 영역 / 스택 영역 / 네이티브 메서드 영역 / PC 레지스터 영역

 

 

 

클래스 영역(= 메소드 영역 = 스태틱 영역)

  • JVM이 읽어들인 클래스의 상수(final), 클래스 변수(= 스태틱 변수), 인스턴스 변수(= 멤버 변수), 메소드 등을 저장하는 영역입니다.

  • Runtime Constant Pool
    • 클래스 파일 Contant Pool 테이블에 해당하는 영역
    • 클래스와 인터페이스 상수, 필드와 메소드에 필요한 모든 레퍼런스 저장 

 

 

 

힙 메모리 영역

  • 프로그램에서 사용되는 데이터를 저장하기 위해 동적으로 할당하여 사용하는 영역입니다.

  • 인스턴스 값이나 배열 등의 데이터를 저장합니다.

  • 힙 영역에 생성된 객체와 배열 등은 스택 영역의 변수나 다른 클래스의 필드에서 참조할 수 있습니다.

  • 참조하는 변수나 필드가 없다면 Gabage Collector에게 수집됩니다.

 

 

 

스택 메모리 영역

  • 쓰레드마다 하나씩 존재하며, 쓰레드가 시작될 때 할당됩니다,

  • 메서드의 정보, 지역 변수, 매개 변수, 연산 중 발생하는 임시 데이터 등이 저장됩니다.

  • push와 pop을 이용한 선입후출(First In Last Out) 방식을 사용합니다.

  • 기본 타입 변수는 스택 영역에 직접 값을 가지며, 참조 타입 변수는 힙, 클래스 영역의 주소를 가집니다.

 

 

 

네이티브 메소드 스택 영역

  • 자바 외의 언어로 작성된 코드(C/C++ 등)를 수행하기 위한 스택 영역입니다.

  • JNI(Java Native Interface) 활용합니다.

  • 네이티브 메소드의 수행을 위한 정보, 지역 변수, 매개 변수, 임시 데이터 등을 저장합니다.

 

 

 

PC 레지스터 영역

  • 자바는 프로그램 실행 시 JVM을 매개하기 때문에 Stack-Base 방식으로 작동합니다.

  • CPU에게 연산을 제공하기 위해 버퍼를 두는 공간으로 활용합니다.

  • 각각의 스레드 수행 시 PC 레지스터가 생성되고, JVM 명령(Instruction) 주소를 보관합니다.

 

 

 

메모리 별 저장되는 변수의 구분

구분 스택 메모리 영역 힙 메모리 영역 클래스 영역
저장되는
변수 유형
로컬 변수(lv),
매개 변수(parameter),
리턴 값 등
인스턴스 변수(iv)
= 멤버 변수(mv),
배열
클래스 변수(cv)
= 스태틱 변수(sv),
상수(constant)