IT 개발 라이프/Back_End

자바(Java)의 메모리 영역

10Biliion 2024. 12. 19. 10:38

자바는 JVM(Java Virtual Machine)을 통해 실행되며, JVM은 프로그램 실행 시 메모리를 효율적으로 관리하기 위해 여러 영역으로 나눕니다. 이 글에서는 자바 메모리 구조를 이해하는 데 필요한 핵심 개념들을 살펴보겠습니다. 🚀

 

자바 메모리 영역의 구성 🗂️

자바 메모리는 크게 아래 다섯 가지 영역으로 나뉩니다:

1. 메소드(Method) 영역(= Static) 📚

  • 역할: 클래스 수준의 정보를 저장하는 공간입니다.
  • 내용:
    • 클래스 로더가 읽어온 클래스 메타데이터
    • static 변수
    • 상수 풀 (Constant Pool)
  • 특징:
    • 모든 쓰레드가 공유하는 영역입니다.
    • JVM 실행 중 런타임 상수나 메서드 정보를 저장합니다.

 

2. 힙(Heap) 영역 🏗️

  • 역할: 객체와 배열을 저장하는 영역으로, JVM에서 가장 큰 메모리 영역입니다.
  • 내용:
    • 모든 객체(instance)
    • 클래스의 인스턴스 변수
  • 특징:
    • 모든 쓰레드가 공유하며, 가비지 컬렉터(GC)에 의해 관리됩니다.
    • 객체는 참조(reference)를 통해 접근합니다.

 

3. 스택(Stack) 영역 🌀

  • 역할: 각 쓰레드별로 실행되는 메서드 호출 정보를 저장합니다.
  • 내용:
    • 메서드 호출 시 생성되는 지역 변수
    • 메서드 호출과 반환 정보
  • 특징:
    • 쓰레드마다 독립적으로 할당됩니다.
    • FILO(First-In, Last-Out) 구조를 따릅니다.

 

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

  • 역할: 쓰레드가 현재 실행 중인 JVM 명령어의 주소를 저장합니다.
  • 특징:
    • 쓰레드마다 고유한 PC 레지스터를 갖습니다.
    • JVM이 명령어를 순차적으로 실행할 수 있도록 돕습니다.

 

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

  • 역할: 자바 외의 네이티브 코드(C/C++ 등) 실행을 지원합니다.
  • 내용:
    • 네이티브 메서드 호출 시 필요한 메모리
  • 특징:
    • 네이티브 메서드 호출에 필요한 데이터를 관리합니다.

 

메모리 관리와 가비지 컬렉션 ♻️

자바는 자동 메모리 관리를 지원합니다. 이를 가능하게 하는 핵심 요소가 **가비지 컬렉터(Garbage Collector)**입니다. 가비지 컬렉터는 힙 영역의 더 이상 참조되지 않는 객체를 탐지하고 제거합니다.

 

가비지 컬렉션의 과정

  1. Marking: 사용하지 않는 객체를 식별합니다.
  2. Evacuation: 불필요한 객체를 제거하고, 필요한 객체를 압축(compaction)하여 메모리 단편화를 줄입니다.

💡 Tip: 가비지 컬렉션은 자동으로 이루어지지만, 프로그래머는 객체의 생명주기를 예측하여 메모리를 효율적으로 사용하는 것이 중요합니다.

 

JVM 옵션으로 메모리 최적화하기 ⚙️

JVM은 메모리 크기를 조정할 수 있는 다양한 옵션을 제공합니다:

  • -Xms: 힙 영역의 초기 크기를 설정합니다.
  • -Xmx: 힙 영역의 최대 크기를 설정합니다.
  • -XX:MetaspaceSize: 메소드 영역(메타스페이스)의 초기 크기를 설정합니다.
  • -XX:MaxMetaspaceSize: 메소드 영역의 최대 크기를 설정합니다.

✅ 적절한 JVM 옵션 설정은 성능 최적화에 매우 중요합니다.