9월10일 - JVM

Yullgiii·2024년 9월 10일
0

Java의 메모리 영역

Java의 메모리 구조는 JVM에 의해 관리되며, 크게 메소드 영역(Method Area), 힙 영역(Heap Area), 스택 영역(Stack Area), PC 레지스터(Program Counter Register), 네이티브 메소드 스택(Native Method Stack)으로 구분됩니다. 각각의 메모리 영역은 프로그램 실행 시 다른 역할을 담당합니다.

1. 메소드 영역 (Method Area)

  • 클래스 정보, 메소드 정보, 변수 정보, static 변수가 저장되는 영역입니다.
  • 클래스가 로딩될 때 생성되며, 주로 프로그램 전체에서 공유되는 정적 정보를 보관합니다.
  • 상수 풀(Constant Pool)이라는 특별한 공간이 포함되어 있으며, 여기에는 문자 상수, 타입, 필드, 메소드 참조와 같은 상수 정보가 저장됩니다.

특징

  • 클래스가 메모리에 처음 로드될 때 메소드 영역이 생성됩니다.
  • 모든 스레드가 공유하는 영역입니다.

2. 힙 영역 (Heap Area)

  • 런타임 시 동적으로 할당되는 메모리 공간입니다.
  • 객체배열이 저장되며, Java에서 new 키워드로 생성된 객체는 모두 힙 영역에 할당됩니다.
  • 참조하는 변수가 없어도 즉시 삭제되지 않고, GC(Garbage Collection)에 의해 제거됩니다.

특징

  • 동적 메모리 할당이 이루어집니다.
  • 객체가 메모리에서 해제될 때까지 힙 영역에 남아있습니다.
  • 여러 스레드가 공유할 수 있습니다.

3. 스택 영역 (Stack Area)

  • 메소드 호출 시마다 각 메소드의 지역 변수, 매개변수, 리턴 주소가 저장됩니다.
  • 메소드가 호출될 때 개별적으로 스택 프레임이 생성되며, 메소드가 종료되면 스택 프레임이 해제됩니다.
  • 컴파일 타임에 할당되며, 스택 영역은 자동으로 관리됩니다.

특징

  • 메소드 호출 시 생성되고, 메소드가 종료되면 해제됩니다.
  • 스레드마다 독립적으로 존재합니다.
  • 지역 변수함수 호출 정보가 저장됩니다.

4. PC 레지스터 (Program Counter Register)

  • 스레드가 생성될 때마다 생성되는 영역으로, 현재 실행 중인 명령의 주소를 저장합니다.
  • JVM이 명령어를 하나씩 실행할 수 있도록 다음 명령어의 주소를 가지고 있습니다.

특징

  • 스레드별로 생성됩니다.
  • JVM이 현재 실행 중인 명령어 위치를 추적할 수 있게 합니다.

5. 네이티브 메소드 스택 (Native Method Stack)

  • 자바 외의 네이티브 언어로 작성된 코드(C, C++)가 실행될 때 사용되는 메모리 영역입니다.
  • Java는 네이티브 메소드를 호출할 수 있으며, 이러한 메소드 호출 시 별도의 스택이 사용됩니다.

특징

  • 자바에서 네이티브 코드를 실행할 때 사용됩니다.
  • 네이티브 메소드가 호출될 때마다 새로운 스택 프레임이 생성됩니다.

예시 코드

public class MemoryExample {
    // 메소드 영역에 저장되는 static 변수
    private static String staticVar = "I'm in Method Area";

    public static void main(String[] args) {
        // 스택에 저장되는 지역 변수
        int localVar = 10;

        // 힙에 저장되는 객체
        Person person = new Person("Alice");

        System.out.println(staticVar);  // 메소드 영역에서 가져옴
        System.out.println(person.getName());  // 힙 영역에서 가져옴
    }
}

class Person {
    // 힙 영역에 저장되는 인스턴스 변수
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

So...

Java의 메모리 구조는 Method Area, Heap, Stack, PC Register, Native Method Stack으로 나뉘며, 각각의 영역이 역할을 분담하여 프로그램이 원활히 실행되도록 돕습니다. 메모리 관리는 JVM에 의해 자동으로 이루어지지만, 힙 영역에서의 과도한 객체 생성은 Out of Memory(OOM) 에러를 일으킬 수 있습니다. 효율적인 메모리 관리를 위해 객체의 생명 주기를 파악하고 필요 없는 객체는 Garbage Collection을 통해 해제되도록 해야 합니다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글