[JAVA]JVM이란?(2)-Runtime Data Area

bbbbbhyun·2025년 2월 18일
0

JAVA

목록 보기
3/5

Runtime Data Area(메모리)

JVM이 사용하는 메모리 영역은 Heap Area, Stack Area, Method Area, PC Register, Native Method Stack로 5가지가 있다

Heap Area

객체가 저장되는 공간

  • 특징
    1. 모든 객체(instance)와 배열이 저장됨
    2. GC가 관리하며, 더 이상 참조되지 않는 객체는 자동으로 제거됨
    3. new 키워드를 사용하여 생성한 객체들이 저장됨

  • 구조

    • Young Generation(젊은 세대)
      1. Eden, Survivor S0, Survivor S1 영역으로 나뉨
      2. 새로운 객체가 먼제 Eden에 저장됨
      3. 오래 살아남은 객체는 Survivor 영역을 거쳐 Old 영역으로 이동
    • Old Generation (노령 세대)
      1. Young Generation에서 오래된 객체가 이동
      2. GC가 상대적으로 덜 발생하지만, 한 번 발생하면 시간이 오래 걸림
    • Metaspace (메타스페이스, 이전 PermGen)
      1. 클래스의 메타데이터가 저장되는 공간 (JDK 8부터 PermGen이 사라지고 Metaspace 도입)
  • 예제

class Person {
    String name;  // name 변수는 Heap 영역의 객체를 참조
}

Person p1 = new Person();  // Person 객체는 Heap에 생성

Stack Area

각 스레드마다 생성되며, 지역 변수와 메서드 실행 정보를 저장

  • 특징
    1. LIFO (Last In First Out, 후입선출) 구조
    2. 메서드가 호출될 때마다 스택 프레임(Stack Frame)이 생성되고, 실행이 끝나면 제거됨
    3. 기본 데이터 타입(Primitive Type)은 스택에 저장됨
    4. 객체 참조 변수는 스택에 저장되지만, 실제 객체는 Heap 영역에 위치함
  • 구조
    1. 메서드 호출 시마다 새로운 Stack Frame이 생성됨
    2. 각 Stack Frame에는 매개변수, 지역 변수, 리턴 주소 등이 포함됨
  • 예제
void methodA() {
    int x = 10;  // x는 Stack에 저장
    methodB();
}

void methodB() {
    int y = 20;  // y는 Stack에 저장.
}
methodA();

Method Area

클래스의 정보(메타데이터), static 변수, 상수, 메서드 코드가 저장되는 공간

  • 특징
  1. 모든 클래스의 메타정보(Class Metadata)가 저장
  2. static 변수는 Heap이 아닌 Method Area에 저장
  3. final 키워드를 사용한 상수(Constant Pool) 도 저장
  4. class 파일이 로드될 때 한번만 생성되며, 프로그램이 종료될 때까지 유지
  • 구조
  1. Class Metadata → 클래스 이름, 필드 정보, 메서드 정보
  2. Static Variable → static 키워드로 선언된 변수
  3. Runtime Constant Pool → final 상수 값
  • 예제
class Sample {
    static int staticVar = 100;  // Method Area에 저장됨
    final int constantVar = 10;  // 상수 풀(Constant Pool)에 저장됨
}

PC Register

현재 실행 중인 명령어의 주소를 저장하는 공간

  • 특징
  1. JVM이 실행하는 각 스레드마다 개별적으로 생성
  2. CPU가 현재 실행해야 할 JVM 명령어의 주소를 저장
  3. 메서드가 실행되면 해당 메서드의 바이트코드 주소를 지칭
  • 예제
public static void main(String[] args) {
    int a = 10;
    int b = 20;
    int c = a + b;  // 이 코드가 실행될 때 PC Register에는 해당 명령어의 주소가 저장
}

Native Method Stack

Java가 아닌 네이티브 코드(C, C++ 등)를 실행하는 공간

  • 특징
  1. JNI (Java Native Interface)를 통해 호출되는 네이티브 코드의 정보를 저장
  2. OS가 제공하는 기능을 호출할 때 사용됨
    • 예: 파일 시스템, 네트워크 등
  3. Java 코드가 System.out.println() 같은 네이티브 메서드를 호출할 때 사용
  • 예제
public class NativeExample {
    public native void nativeMethod(); // 네이티브 메서드 선언

    static {
        System.loadLibrary("nativeLib"); // 네이티브 라이브러리 로드
    }
}

참고

https://tecoble.techcourse.co.kr/post/2021-08-09-jvm-memory/
https://velog.io/@impala/JAVA-JVM-Runtime-Data-Area
https://jithub.tistory.com/40
https://velog.io/@ddangle/Java-%EB%9F%B0%ED%83%80%EC%9E%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%98%81%EC%97%ADRuntime-Data-Area%EC%97%90-%EB%8C%80%ED%95%B4

profile
BackEnd develope

0개의 댓글

관련 채용 정보