Java

[Java]자바 메모리 관리: 스택(Stack)& 힙(Heap)

누구세연 2024. 11. 20. 23:17

자바 애플리케이션은 JVM 위에서 동작하며, JVM은 효율적인 메모리 관리를 위해 스택(Stack)과 힙(Heap)을 중심으로 메모리를 관리합니다. 이 글에서는 스택과 힙의 구조, 동작 원리, 그리고 실제 개발에서 반드시 알아야 할 내용을 정리하겠습니다.✍️

 

JVM 메모리 구조에서 스택과 힙의 위치

JVM의 메모리는 크게 5가지로 나뉩니다.

 

  • 메서드 영역(Method Area): 클래스 정보와 상수 풀(Constant Pool) 저장
  • 힙(Heap): 모든 객체와 배열이 저장
  • 스택(Stack): 각 스레드의 메서드 호출과 관련된 데이터 저장
  • PC 레지스터(Program Counter Register): 현재 실행 중인 명령어 주소 저장
  • 네이티브 메서드 스택(Native Method Stack): 네이티브 코드(C, C++ 등) 실행 정보 저장

JVM 메모리 구조

 

 

 

스택(Stack)의 구조와 동작 원리

스택은 각 스레드마다 독립적으로 존재하며, 메서드 호출 시 생성되는 프레임(Frame)으로 구성됩니다.

프레임 구성 요소

 

  • 로컬 변수(Local Variables): 메서드의 파라미터와 지역 변수
  • 연산 스택(Operand Stack): 명령 실행에 필요한 피연산자 저장
  • 메서드 호출 정보(Method Reference): 호출된 메서드에 대한 반환 주소 등

예제 코드와 스택 구조

public int sum(int a, int b) {
    int result = a + b;  // result가 로컬 변수 영역에 저장됨
    return result;       // 메소드 반환 시 프레임 삭제
}

 

스택 프레임 구조

스택 관련 오류

  • StackOverflowError: 너무 깊은 재귀 호출이나 무한 호출 발생
    • 해결 방법: 재귀 호출을 반복문으로 변경하거나 호출 깊이 제한

 

힙(Heap)의 구조와 동작 원리

힙은 모든 객체와 배열이 저장되는 공간으로 Garbage Collector(GC)에 의해 관리됩니다.

힙 메모리 세분화

  1. Young Generation: 새롭게 생성된 객체 저장
    • Eden 영역: 새로 생성된 객체가 처음 저장되는 공간
    • Survivor 영역: GC 후 살아남은 객체 저장
  2. Old Generation: Young Generation에서 오래 살아남은 객체 저장

GC 동작 과정

  1. 객체 생성 시 Eden 영역에 저장
  2. Minor GC 수행 → 살아남은 객체는 Survivor 영역으로 이동
  3. Survivor 영역에서 일정 횟수 살아남은 객체는 Old Generation으로 이동

힙 관련 오류

  • OutOfMemoryError: Java Heap Space: 힙 메모리가 가득 찼을 때
    • 해결 방법:
      • JVM 옵션 -Xmx로 힙 크기를 늘림
      • 메모리 누수 탐지 도구(예: VisualVM, Eclipse MAT)로 문제 추적

 

스택과 힙의 상호작용

class Example {
    int value;
    Example(int value) {
        this.value = value;
    }
}

public static void main(String[] args) {
    Example ex = new Example(10); // ex는 스택에, new Example은 힙에 저장
}

 

메모리 참조 관계 다이어그램

 

 

실전에서 알아야 할 추가 개념

1) Escape Analysis와 스택 할당 최적화

자바 8 이후, 객체가 메서드 밖으로 "Escape"하지 않는다고 판단되면 객체를 힙 대신 스택에 할당하여 성능을 최적화할 수 있습니다.

2) GC 튜닝과 성능 최적화

  • JVM 옵션 -XX:+UseG1GC를 활용하여 GC 동작을 최적화.
  • 힙 크기 조정을 통해 메모리 부족 문제 해결(-Xms와 -Xmx).

 

💡 스택과 힙은 자바 메모리 관리의 핵심 요소입니다.
스택은 빠르고 단순한 메모리 구조로 메서드 호출과 지역 변수를 관리합니다.
힙은 동적 객체를 저장하며, Garbage Collector가 자동으로 관리합니다.
이 두 영역의 동작 원리를 이해하면 디버깅과 성능 최적화에서 큰 도움을 받을 수 있습니다.