Java 오류 & 개발/Java 기본 문법 & 오류
[Java] Java의 메모리 관리: Stack vs Heap 개념과 차이점
Jinsapp
2025. 3. 14. 17:37
[Java] Java의 메모리 관리: Stack vs Heap 개념과 차이점
1. Java의 메모리 구조
Java 프로그램이 실행될 때, JVM(Java Virtual Machine)은
Stack과 Heap이라는 두 가지 주요 메모리 영역을 사용하여 데이터를 관리합니다.
각 메모리 영역은 서로 다른 역할을 수행하며, 효율적인 메모리 사용을 위해 각각의 특성을 이해하는 것이 중요합니다.
2. Stack과 Heap의 차이점
항목 | Stack | Heap |
---|---|---|
저장하는 데이터 | 메서드 호출 시 생성되는 지역 변수(Primitive Type) 및 참조 변수 | 객체 및 배열 (new 키워드로 생성된 데이터) |
메모리 할당 방식 | LIFO (Last In First Out) 구조 | 동적 할당 (Garbage Collector가 관리) |
생명주기 | 메서드 실행이 끝나면 자동으로 제거됨 | 객체가 참조되지 않으면 GC(Garbage Collector)에 의해 제거됨 |
속도 | 빠름 (메모리 접근이 간단) | 느림 (GC의 개입 필요) |
3. Stack 메모리 예제
Stack 영역에는 기본형 변수(Primitive Type)와 참조형 변수(Reference Type)의 메모리 주소가 저장됩니다.
public class StackExample {
public static void main(String[] args) {
int a = 10; // Stack 메모리에 저장
int b = 20; // Stack 메모리에 저장
int result = add(a, b); // 메서드 호출 시 Stack 프레임 생성
System.out.println(result);
}
public static int add(int x, int y) {
return x + y; // Stack에서 실행 후, 메서드 종료 시 제거됨
}
}
4. Heap 메모리 예제
Heap 영역에는 new
키워드로 생성된 객체가 저장됩니다.
class Person {
String name;
Person(String name) {
this.name = name;
}
}
public class HeapExample {
public static void main(String[] args) {
Person p1 = new Person("Alice"); // Heap 메모리에 저장
Person p2 = new Person("Bob"); // Heap 메모리에 저장
System.out.println(p1.name + " & " + p2.name);
}
}
5. Stack과 Heap의 동작 방식
- ✔ Stack은 메서드가 호출될 때 생성되며, 메서드 종료 시 자동 해제됩니다.
- ✔ Heap은 프로그램이 실행되는 동안 유지되며, Garbage Collector가 관리합니다.
6. 메모리 누수를 방지하는 방법
Heap 메모리에 있는 객체는 참조가 사라지지 않으면 GC에 의해 제거되지 않으므로, 메모리 누수를 방지하려면 다음과 같은 방법이 필요합니다.
- ✔ 사용하지 않는 객체는 null로 설정 (GC가 감지하도록)
- ✔ 컬렉션(List, Map 등)에 저장된 불필요한 객체 제거
- ✔ try-with-resources를 사용하여 자원 해제 (파일, DB 연결 등)
📌 정리
- ✔ Stack은 메서드 실행 중 임시 데이터를 저장하며, 빠르게 생성/제거됨
- ✔ Heap은 객체와 배열이 저장되며, GC에 의해 관리됨
- ✔ Stack은 빠르고 간단하지만 제한된 공간을 가짐, Heap은 유연하지만 성능 저하 가능
- ✔ GC를 활용하여 Heap 메모리를 최적화하고 메모리 누수를 방지해야 함
🔗 다른 Java 메모리 관리 관련 글도 함께 확인해보세요!