Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- 오블완
- serverless
- Docker
- goorm x kakao
- Redis
- MSA
- DynamoDB
- s3
- 자격증
- backend
- jvm
- bootcamp
- 티스토리챌린지
- 자바
- Cache
- spring
- orm
- 스터디
- CodeCommit
- Spring Boot
- backenddeveloper
- data
- 개발자
- QueryDSL
- mapping
- jpa
- aws
- goorm
- java
- nosql
Archives
- Today
- Total
gony-dev 님의 블로그
자바 코드의 메모리 영역 본문
이전 시간에는 Garbage Collection을 개선하기 위한 GC Tuning에 대해 과정을 간단히 살펴보았다.
[JVM] - Garbage Collection Tuning
이번 포스팅에서는 JVM에서 사용하는 메모리 영역에 대해 알아보도록 하겠다.
출처
Sujinhope.github.com
Inpa Dev
Java 메모리 영역
JVM 구동 과정에서 살펴보았듯이 JVM은 OS로부터 메모리를 할당받고, 용도에 따라 각기 다른 영역으로 나누어 관리한다.
메모리 공간은 크게 Method 영역, Stack 영역, Heap 영역으로 나뉘며, 데이터의 타입에 따라 다른 영역으로 나누어 할당된다.
1. Method Area
- 바이트 코드를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 영역
- 초기화 코드 정보들인 정적 필드와 클래스 구조만을 갖고 있다.
2. Heap Area
- JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역
- 클래스, 인스턴스 변수, 배열 타입 등 Reference Type을 저장하는 공간
3. Stack Area
- 임시적으로 사용되는 변수나 정보들이 저장되는 영역
- 기본 타입 변수를 가지며, 해당 객체를 통해서만 힙 영역에 있는 인스턴스를 핸들링 할 수 있다.

컴퓨터의 메모리는 사용 가능한 공간이 한정되어 있어 이것을 어떻게 관리하느냐에 따라서 성능이 좌우된다.
그러므로 같은 기능의 프로그램이라 하여도 컴퓨터 메모리에 따라 성능의 차이가 나게 된다.
Java 변수 종류
변수는 크게 4종류로 변수의 선언된 위치에 따라 나뉜다.
| 변수명 | 선언 위치 | 설명 |
| 클래스 변수 (class variable) |
클래스 영역 | - 클래스 내에 Static 키워드로 선언된 변수 - 처음 JVM이 실행되어 클래스가 메모리에 할당되는 시점부터 종료될 때까지 유지된다. - 클래스가 여러 번 생성되어도 static 변수는 한 번만 생성된다. - 동일한 클래스의 모든 객체들에 공유된다. |
| 인스턴스 변수 (instance variable) |
- 클래스 내에서 static이 아닌 변수 - 개별적인 저장 공간으로 객체 또는 인스턴스마다 다른 값이 저장 가능하다. - 클래스 변수와 달리 공유되지 않는다. |
|
| 지역 변수 (local variable) |
메서드 영역 | - 메서드 내에서 선언되고 메서드 수행이 끝나면 소멸되는 변수 |
| 매개 변수 (parameter) |
- 메서드 호출 시 메서드가 받을 입력값을 나타내는 변수 - 메서드의 입력 인터페이스의 역학을 수행 |
클래스 영역에서의 클래스 변수와 인스턴스의 변수는 static 선언의 유무가 차이점이라고 생각하면 된다!
코드를 통해 확실히 알아보자.
public class HelloWorld {
private String str1 = "Hello World!"; // 인스턴스 변수
private static String str2 = "Not a word."; // 클래스 변수
public int add(int a, int b){ // a, b는 매개변수
int sum = a + b; // sum은 지역 변수
}
}
Method Area
- JVM가 시작될 때 생성되며, 읽어들인 클래스와 인터페이스에 대한 runtime constant pool, 멤버 변수, 클래스 변수, 상수, 생성자와 메서드를 저장하는 공간이다.
- Method Area에 있는 것은 어느 곳에서나 접근 가능하며
JVM이 동작하고 클래스가 로드될 때 적재되서 프로그램이 종료될 때까지 메모리에 남아있다. - 프로그램이 종료될 때까지 어디서든 사용이 가능하지만 무분별하게 사용할 경우 메모리 부족 현상이 일어날 수 있으니 주의하자.
Stack Area
- 임시로 사용되는 변수가 정보들이 저장되는 공간으로
메서드가 호출될 때 stack area에 stack frame(하나의 메서드에 필요한 메모리 덩어리를 묶는 프레임)이 생기고
그 안에 메서드를 호출한다. - 원시 타입의 데이터에 해당되는 지역변수(int, double, boolean), 매개 변수 데이터 값이 저장된다.
- 메서드가 호출될 때 메모리에 할당되고 종료될 시에 메모리에서 사라진다.
- 스택은 LIFO의 특징을 가지고 있으며, 스코프의 범위에서 벗어나면 스택 메모리에서 사라진다.
Heap Area
- 힙 영역은 JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당되는 영역이다.
- Reference 타입만을 저장하며, 힙 영역에 있는 오브젝트들을 가리키는 참조 변수는 스택 영역에 적재된다.
- 힙 영역은 스택 영역과 다르게 보관되는 메모리가 호출이 끝나도 삭제되지 않고 잔존한다.
이후에 더이상 어떤 참조 변수도 힙 영역에 있는 인스턴스를 참조하지 않게 되면, GC에 의해 회수된다. - 힙 영역은 하나의 영역만 존재하며, 모든 쓰레드가 공유할 수 있다.
힙, 스택 영역 정리
- 힙 메모리는 어플리케이션의 모든 부분에서 사용되지만, 스택 메모리는 하나의 쓰레드가 실행될 때 사용된다.
- 객체가 생성되면 힙 영역에 적재되며, 스택 메모리는 힙 공간에 있는 객체를 참조한다.
- 힙 메모리는 프로그램 실행부터 종료될 때까지 유지되지만, 스택 메모리는 생명 주기가 매우 짧다.
- 스택 메모리 사이즈는 힙 메모리와 비교했을 때 매우 작지만, LIFO를 통해 속도가 더 빠르다.

'JVM' 카테고리의 다른 글
| 클래스 로드 및 초기화 시점 (0) | 2025.12.22 |
|---|---|
| Call by Value / Call by Reference (0) | 2025.12.14 |
| Garbage Collection Tuning (0) | 2025.12.08 |
| Garbage Collection 동작 원리 및 종류 (0) | 2025.12.04 |
| JVM 내부 구조 & 메모리 영역 (0) | 2025.12.01 |