자바 메모리 구조 Method Area·Heap·Stack 이해하기
자바 메모리 구조는 JVM(Java Virtual Machine)이 운영 체제에서 할당받은 메모리를 메소드 영역, 힙, 스택으로 나눠 관리하는 방식을 말합니다. 이 세 영역을 이해하면 가비지 컬렉션 튜닝, 스레드 안정성 확보, 성능 최적화 등 실제 개발 업무에서 큰 도움이 됩니다.
자바 메모리 구조란?
자바 애플리케이션은 OS 위에서 직접 실행되지 않고 JVM 위에서 동작합니다. JVM은 프로그램 실행 중 필요한 메모리를 용도별로 분리해 관리함으로써 플랫폼 독립성과 안전성을 동시에 확보합니다.
메소드 영역(Method Area)
- 클래스 메타데이터·정적 변수(
static)를 저장 - 클래스 로딩 시 생성되어 모든 스레드가 공유
- JDK 8부터는 Metaspace로 관리돼, OS 메모리를 탄력적으로 사용
예시
public class Sample { static int counter = 0; // 메소드 영역에 저장 }
힙(Heap)
new키워드로 생성한 모든 객체와 인스턴스 변수 저장- Young → Old로 나뉘어 가비지 컬렉터(GC)가 관리
- JVM 튜닝 시
Xms,Xmx,XX:+UseG1GC등 힙 관련 옵션을 집중적으로 조정
Test obj = new Test(); // 힙에 객체가 생성
obj.value = 42;
스택(Stack)
- 메소드 호출 정보·지역 변수·매개변수 보관
- 스레드마다 독립적으로 존재해 LIFO 방식으로 자동 해제
- 스택 오버플로우는 재귀 호출 또는 무한 루프에서 주로 발생
public void calc(int n) { // n은 스택에 저장
int result = n * 2; // result도 스택
}
JVM 메모리 동작 흐름
- 클래스 로딩 → 메타데이터·
static변수 → 메소드 영역 - 객체 생성 → 인스턴스·속성 → 힙
- 메소드 호출 → 지역 변수·매개변수 → 스택
- 가비지 컬렉션 → 참조 없는 객체를 힙에서 회수
왜 자바 메모리 구조를 이해해야 할까?
- 메모리 누수 진단 및 GC 튜닝
- 스레드 안전 확보(스택은 스레드별, 힙은 공유)
- 성능 최적화 – 객체 생명주기 예측으로 생성·해제 비용 절감
요약
| 영역 | 주요 저장 데이터 | 할당 방향 | 스레드 공유 여부 |
|---|---|---|---|
| 메소드 영역 | 클래스 정보, static 변수 |
고정 | 공유 |
| 힙 | 객체, 인스턴스 변수 | 낮은 → 높은 주소 | 공유 |
| 스택 | 지역 변수, 매개변수, 스택 프레임 | 높은 → 낮은 주소 | 독립 |
질문 정리
-
자바 메모리 구조를 모르고도 개발할 수 있나요?
가능하지만, GC 튜닝·메모리 최적화 작업 시 반드시 필요한 기초 지식입니다.
-
힙이 가득 차면 어떻게 되나요?
가비지 컬렉션 후에도 여유 공간이 없으면 OutOfMemoryError가 발생합니다.
-
스택 크기를 늘릴 수 있나요?
JVM 옵션
-Xss로 스레드당 스택 크기를 조정할 수 있습니다. -
메소드 영역은 더 이상 PermGen이 아닌가요?
네, JDK 8부터는 Metaspace로 대체돼 PermGen보다 유연하게 메모리를 사용합니다.
-
가비지 컬렉션을 완전히 끌 수 있나요?
XX:+UseZGC등 저지연 GC를 선택하거나, 특수 옵션으로 끌 수 있지만 권장되지 않습니다.
댓글남기기