언어/Java

JAVA 자바 메모리 구조

린예라 2024. 11. 18. 22:32

자바 언어에서 사용되어지는 메모리구조를 정리

1. Method Area (메소드 영역)

  • 역할:
    • 클래스와 메소드의 메타데이터(클래스 정보, 메소드 정보, 상수 풀 등)를 저장하는 영역
    • 모든 스레드가 공유
    • 드물게 클래스 언로드가 필요할 때, GC가 작동할 수 있음 (서버/동적 클래스 환경)

 

  • 저장하는 것들:
    • 클래스 데이터 (메소드, 필드 정보)
    • 상수 풀 (Constant Pool)
    • 정적 변수 (Static Variables)
    • 메소드 코드 (Method Code)

 

2. Heap Area (힙 영역)

  • 역할:
    • 객체와 배열이 생성되고 저장되는 영역
    • 모든 스레드가 공유하며, JVM에서 Garbage Collector(GC)에 의해 관리

 

  • 특징:
    • Young Generation
      • 객체가 처음 생성되는 곳
      • Young Generation은 EdenSurvivor(From/To) 영역으로 나뉨
      • Eden 영역에서 객체가 생성되고, 살아남으면 Survivor 영역으로 이동
    • Old Generation
      • Young Generation을 거쳐 오래 살아남은 객체가 저장
      • GC가 비교적 드물게 일어나지만 더 오래 걸림

 

  • Garbage Collection (GC)와 메모리 관리
    • Minor GC: Young Generation에서 발생
    • Major GC (Full GC): Old Generation에서 발생하며, 성능에 큰 영향
    • Garbage Collection은 더 이상 참조되지 않는 객체를 정리하여 메모리를 확보

 

3. Stack Area (스택 영역)

  • 역할:
    • 각 스레드마다 별도로 존재하며, 메소드 호출과 관련된 정보를 스택 프레임에 저장

 

  • 저장하는 것들:
    • 메소드의 지역 변수 (함수 호출 시 생선된 매개변수도 지역변수로 간주하여 같이 저장)
    • Return Address
    • 오퍼랜드 스택
    • 메서드가 소속된 클래스에 대한 참조정보

 

  • 특징:
    • 메모리 할당과 해제가 빠르며, LIFO(Last In, First Out) 구조

 

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

  • 역할:
    • 각 스레드마다 하나씩 존재하며, 현재 실행 중인 JVM 명령어의 주소를 저장

 

  • 특징:
    • 매우 작은 메모리 영역으로, 스레드가 어디를 실행하고 있는지 관리

 

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

  • 역할:
    • Java가 아닌 다른 언어(흔히 C/C++)로 작성된 네이티브 코드를 실행할 때 사용

 

  • 특징:
    • JNI(Java Native Interface)를 통해 호출된 네이티브 메소드의 실행 정보를 저장

 

 

메모리 구조 예시

public class MemoryExample {
    // Static 변수 (Method Area)
    static String staticVar = "Static Variable";
    
    // Instance 변수 (Heap)
    int instanceVar = 10;
    
    public static void main(String[] args) {
        // 지역 변수 (Stack)
        int localVar = 20;
        
        // 객체 생성 (Heap)
        MemoryExample example = new MemoryExample();
        
        // 메서드 호출 (Stack)
        example.display(localVar);
    }
    
    void display(int param) {
        // 매개변수 (Stack)
        System.out.println("Instance Var: " + instanceVar);
        System.out.println("Parameter: " + param);
    }
}

정리

Java 메모리 구조는 크게 Method Area, Heap, Stack, PC Register, Native Method Stack으로 나뉘고, 각각의 영역은 특정 목적을 가지고 있으며, Garbage Collector를 통해 자동으로 메모리를 관리한다.

 

'언어 > Java' 카테고리의 다른 글

Optional 옵셔널  (0) 2024.11.22
자바 컴파일 과정  (2) 2024.11.19
알고리즘 문제풀이용 JAVA 문법 정리  (2) 2024.11.13
래퍼 클래스 (Wrapper Class)  (1) 2024.04.18
람다식  (0) 2024.03.22