자바는 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)**입니다. 가비지 컬렉터는 힙 영역의 더 이상 참조되지 않는 객체를 탐지하고 제거합니다.
가비지 컬렉션의 과정
- Marking: 사용하지 않는 객체를 식별합니다.
- Evacuation: 불필요한 객체를 제거하고, 필요한 객체를 압축(compaction)하여 메모리 단편화를 줄입니다.
💡 Tip: 가비지 컬렉션은 자동으로 이루어지지만, 프로그래머는 객체의 생명주기를 예측하여 메모리를 효율적으로 사용하는 것이 중요합니다.
JVM 옵션으로 메모리 최적화하기 ⚙️
JVM은 메모리 크기를 조정할 수 있는 다양한 옵션을 제공합니다:
- -Xms: 힙 영역의 초기 크기를 설정합니다.
- -Xmx: 힙 영역의 최대 크기를 설정합니다.
- -XX:MetaspaceSize: 메소드 영역(메타스페이스)의 초기 크기를 설정합니다.
- -XX:MaxMetaspaceSize: 메소드 영역의 최대 크기를 설정합니다.
✅ 적절한 JVM 옵션 설정은 성능 최적화에 매우 중요합니다.
'IT 개발 라이프 > Back_End' 카테고리의 다른 글
JRE, JDK, JVM: 자바의 핵심 구성 요소 🚀 (0) | 2024.12.18 |
---|---|
자바의 가비지 컬렉터 (Garbage Collector) 🗑️ (0) | 2024.12.18 |
자바에서의 Stack, Queue, Deque ✨ (0) | 2024.12.18 |
자바 ReflectionUtils: 리플렉션을 쉽게 활용하는 방법 🛠️ (0) | 2024.12.16 |
추상 클래스와 인터페이스 (0) | 2024.12.11 |