본문 바로가기
JAVA

[JAVA] JAVA 메모리 영역(method, stack, heap 영역)

by 정공자씨 2024. 4. 19.

 

 

Runtime Data Area

정의

  • JVM이 프로그램을 수행하기 위해 OS(운영체제)로부터 할당받은 메모리 영역
  • JVM의 메모리 영역으로 
  • 프로그램 실행 시에 사용되는 데이터들을 적재(저장)하는 영역

 

Runtime Data Area의 5개의 영역

  • Method Area
  • Heap Area
  • Stack Area
  • PC Register
  • Native Method Stack

 

 

 

 

 

 Method  Area(Static Area, Class Area)

정의

  • 클래스에 대한 정보가 저장되는 영역

 

특징

 

1. 클래스와 인터페이스의 메타데이터(메서드, 멤버변수 정보 등)를 Method Area에 저장

  • 프로그램 실행 중에 클래스나 인터페이스를 사용하게 되면
  • JVM은 ClassLoader(클래스 로더)에게 요청하여
  • 클래스와 인터페이스의 메타데이터를 Method Area에 저장함

2. Method Area에는 클래스에 대한 모든 정보가 ByteCode 형태로 로드 됨

  • JVM은 자바 소스코드(.java 파일)을 컴파일하여 ByteCode(.class 파일)을 만들고
  • Class Loader를 이용해 를 Method Area에 실행 가능한 상태로 로드

 

3. 프로그램 시작부터 종료될 때까지 메모리에 적재

 

4. 모든 스레드(thread)가 공유하는 영역

  • 클래스에 대한 정보가 이 영역에 존재하기 때문에
  • 클래스의 인스턴스를 생성(객체 생성)하기 위해서는 Method Area를 참조하여야 하고
  • 따라서 모든 스레드(thread)가 이 영역을 공유하게 됨

 

 

Method Area에 저장되는 메타데이터(metadata)

 

1. 필드(멤버변수) 정보 : 인스턴스 변수(멤버변수)의 정보를 저장

  • Type명 : 인스턴스 변수의 타입
  • Type의 제어자 : 접근제어자(public, private 등) 

2. 메서드 정보 : 메소드의 모든 정보를 저장

  • 메서드 이름
  • 매개변수의 수, 매개변수의 타입
  • 반환 타입

3. 타입 정보 : 클래스와 인터페이스의 정보

  • Type의 이름 : 패키지 이름을 포함한 클래스의 이름
  • Type의 종류 : 클래스인지 인터페이스인지의 여부
  • Type의 제어자 : 접근제어자(public, private 등) 및 기타 제어자(abstract, final 등)
  • 연관된 인터페이스의 정보 : 클래스에서 사용된 인터페이스의 정보

4. 클래스 변수 : static으로 선언된 변수 저장

  • static 변수는 class 변수라도고 함

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

  • 클래스와 인터페이스 상수, 메소드와 멤버변수에 대한 모든 참조(Reference)를 저장
  • JVM에서는 해당 메소드와 멤버변수의 실제 메모리상의 주소를 찾기 위해 참조
  • Method Area에 클래스의 정보가 올라오면
    • Constant Pool에 대한 포인터를 생성하여
    • 언제든지 클래스 내의 상수에 대해 접근이 가능하도록 함

 

[Runtime Constatnt Pool]

1. Method Area(메서드 영역) 내에 존재하는 별도의 관리 영역
2. 컴파일 시에 클래스 파일(.class) 내부에 존재하는 영역으로,
    ClassLoader에 의해 JVM에 로드될 때 Method Area에에 로드됨
2. 각 클래스(class), 인터페이스(interface)마다 별도로 constant pool 테이블이 존재하는데
    클래스를 생성할 때마다 참조해야 할 정보들을 상수로 가지고 있는 영역
3. JVM은 이 constant pool을 통해서해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조함

즉, 상수 자료형을 저장하고 참조하여, 중복을 막는 역할을 수행

 

[ String Constant Pool ]


1. String Constant  Pool

  · Java에서 문자열 리터럴을 저장하는 독립된 영역

  · JVM의 Perm/Metaspace 영역에 존재하고
  · 일반적으로 GC(garbage collector) 대상이 되지 않음
  · 한번 저장된 문자열인 경우, String Constant Pool에 저장된 리터럴을 재사용할 수 있음

//string constant pool에 저장
String str = "정공자";   // string constant pool에 저장
String str2 = "정공자";  // 같은 문자열, string constant pool에서 재사용

String str3 = new String("비정공자의 정공법"); // 별도의 heap 영역에 저장

 

 

·

 

 

 

 

 Heap Area

정의

  • 데이터를 저장하기 위해서 런타임(Runtime) 시에 동적으로 할당하여 사용하는 메모리 영역
  • 즉, 런타임(실행) 시에 결정되는 참조형 타입의 데이터들이 저장

 

 

특징

1. new 연산자를 통해서 생성된 객체(인스턴스)가 저장되는 공간

  • 인스턴스 변수도 heap 영역에 저장

2. 런타임 시에 결정되는 참조형 타입(Reference Type)의 데이터가 저장

  • 인터페이스
  • 배열 타입(array)
  • 메서드 영역(Method Area)에 로드된 클래스
[ 런타임 시에 결정되는 참조형 ]
런타임(실행)시에 결정됨에 따라 
동작 중에는 문제가 발생할 코드(자료형의 범위를 초과한 값 등)임에도 불구하고
문법 상의 문제는 아니므로, 컴파일(파일 저장) 시에는 에러가 발생하지 않음

 

3. 모든 쓰레드가 공유하는 영역

[ 모든 쓰레드가 공유하는 영역 ]
· 메서드 영역(Method Area)
· 힙 영역(Heap Area)

 

4. CG(garvage collecter)가 청소하는 공간

1. 객체가 더 이상 사용되지 않거나
2. 명시적으로 nul을 선언했을 때
  • 위의 경우에 의미가 없는 객체가 되기 때문에, 해당 객체는 쓰레기로 취급이 되고
  • JVM은 가비지 컬렉터(garbage collector)를 실행 시켜, 쓰레기 객체를 Heap 영역에서 자동으로 제거함

 

 

 

 

 

 

 Stack Area(스택 영역)

정의

  • 컴파일 시에 결정되는 기본형 타입의 데이터가 저장되는 곳

 

특징

1. 컴파일 시에 결정되는 기본형 타입(int, long, boolean 등)의 데이터를 저장하는 공간

int sum = 5;       // sum이라는 이름의 공간이 stack 영역에 생기고, 공간에 5를 저장

   

2. 임시적으로 사용되는 변수, 정보 등이 저장되는 영역

임시적으로 사용되는 변수는
메서드 안에서 사용되는 지역변수, 매개변수, 리턴값, 연산에 사용되는 임시데이터 등이 있음

 

3. stack(스택)은 각 스레드(thread)마다 생성

 

4. 메서드가 호출될 때마다 각각의 스택 프레임(stack frame)이 생성

  • 각 스택 프레임은 1개의 메서드에 대한 정보를 저장함

 

 

메서드를 호출할 때마다

  • 각각의 스택 프레임(stack frame, 해당 메서드만을 위한 공간)이 생성되고
  • 각각의 스택 프레임에는 메서드 안에서 사용되는 값들을 저장함
    • 즉, 호출된 메서드의 매개변수, 지역변수, 리턴 값, 연산에 사용되는 값들이
    • 임시로 저장함

메서드 수행이 끝나면(메서드가 종료되면) 프레임별로 Stack에서 삭제가 됨

[ 스택 프레임(stack frame) ]
메소드가 호출될 때마다 각각의 프레임이 만들어지며
현재 실행중인 메소드 상태 정보를 저장하는 곳

메서드 호출 되었을 때 스택에 생성되고, 메서드가 종료되면 스택에서 제거

스택 프레임에 쌓이는 데이터(저장되는 데이터)는
메서드의 매개변수, 지역변수, 리턴값, 연산에 사용되는 값 등이 저장

 

 

5. 데이터의 타입에 따라 스택(Stack)에 저장되는 데이터가 다름

  • 기본형 타입의 변수 : 스택 영역에 직접 값을 저장함
  • 참조형 타입의 변수 : 힙 영역이나 메소드 영역의 객체 주소값(위치값)를 저장

① 기본형 타입 변수의 경우

int num = 10; 
  • 정수형 데이터 값이 저장될 수 있는 num(변수)이라는 이름의 메모리 공간이 스택(stack) 영역에 생성되고
  • 10이라는 실제 값이 들어감

② 참조형 타입 변수의 경우

Car c = new Car(); 
  • new Car();
    • new Car(); 코드를 이용하여 객체를 생성하면
    • Car 인스턴스가 만들어지면서, 메모리 영역이 생기는데
    • Car 인스턴스가 저장되는 메모리 영역이 힙(Heap) 영역 
  • Car c
    • Car 데이터 타입을 가진 c라는 변수를 선언하면
    • c라는 이름을 가진 메모리 공간이 스택(stack) 영역에 생성되고
    • Car 인스턴스가 위치하는 공간의 위치값(주소값)을 변수(c)에 대입하여 사용

 

 

 

 

 

 

 

 

 

출처

https://deveric.tistory.com/123