자바 언어에서 사용되어지는 메모리구조를 정리
1. Method Area (메소드 영역)
- 역할:
- 클래스와 메소드의 메타데이터(클래스 정보, 메소드 정보, 상수 풀 등)를 저장하는 영역
- 모든 스레드가 공유
- 드물게 클래스 언로드가 필요할 때, GC가 작동할 수 있음 (서버/동적 클래스 환경)
- 저장하는 것들:
- 클래스 데이터 (메소드, 필드 정보)
- 상수 풀 (Constant Pool)
- 정적 변수 (Static Variables)
- 메소드 코드 (Method Code)
2. Heap Area (힙 영역)
- 역할:
- 객체와 배열이 생성되고 저장되는 영역
- 모든 스레드가 공유하며, JVM에서 Garbage Collector(GC)에 의해 관리
- 특징:
- Young Generation
- 객체가 처음 생성되는 곳
- Young Generation은 Eden과 Survivor(From/To) 영역으로 나뉨
- Eden 영역에서 객체가 생성되고, 살아남으면 Survivor 영역으로 이동
- Old Generation
- Young Generation을 거쳐 오래 살아남은 객체가 저장
- GC가 비교적 드물게 일어나지만 더 오래 걸림
- Young Generation
- 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 |