
목차 ▽열기
자바(Java)는 메모리 관리를 자동으로 처리하는 언어입니다. 이 말은, 개발자가 직접 메모리를 할당하거나 해제할 필요 없이 JVM(Java Virtual Machine)이 알아서 관리해준다는 뜻이죠. 그렇다면 메모리가 어떻게 나뉘고, 어디에 어떤 값이 저장되는지, 또 언제 어떻게 메모리가 정리되는지를 아는 것은 자바 개발자에게 꼭 필요한 지식입니다.
오늘은 자바의 핵심 메모리 구조인 스택(Stack), 힙(Heap), 그리고 **가비지 컬렉션(Garbage Collection)**에 대해 초보자도 쉽게 이해할 수 있도록 설명해드리겠습니다.
1. 자바 메모리 구조: 스택과 힙
스택(Stack) 메모리란?
스택은 메서드 호출 시 사용되는 메모리 공간입니다. 함수 내부에서 선언된 지역 변수(local variable) 들은 모두 스택에 저장됩니다.
특징 요약:
- LIFO(Last In First Out) 구조
- 메서드 호출 시 할당되고, 종료 시 자동 제거
- 매우 빠른 속도
- 기본형 변수 및 참조형 변수의 주소값 저장
public void sayHello() {
int num = 10; // 스택에 저장
String msg = "Hello"; // 참조값은 스택, 실제 문자열은 힙
}
위 코드에서 num과 msg는 스택에, "Hello" 문자열 객체는 힙에 저장됩니다.
힙(Heap) 메모리란?
힙은 new 연산자를 통해 생성된 객체와 배열이 저장되는 공간입니다. 객체의 생명 주기는 직접 관리하지 않아도 되고, **가비지 컬렉터(GC)**가 알아서 삭제합니다.
특징 요약:
- 모든 스레드가 공유
- new 키워드로 생성된 객체 저장
- JVM의 GC가 관리 (자동으로 정리됨)
Example obj = new Example(); // obj는 스택, 실제 객체는 힙
2. 로컬 변수 vs 멤버 변수
항목 로컬 변수 (Local Variable) 멤버 변수 (Member Variable)
메모리 위치 | 스택(Stack) | 힙(Heap) |
선언 위치 | 메서드 내부 | 클래스 내부 |
생명 주기 | 메서드 실행 중 | 객체가 존재하는 동안 |
초기화 | 반드시 초기화해야 함 | 자동으로 기본값 설정됨 |
접근 범위 | 메서드 내부에서만 접근 가능 | 클래스 내부 어디서든 접근 가능 |
public class Cat {
String name; // 멤버 변수 → 힙에 저장됨
public void speak() {
String sound = "Meow"; // 로컬 변수 → 스택에 저장됨
}
}
3. 가비지 컬렉션(Garbage Collection)이란?
가비지 컬렉션은 JVM이 자동으로 사용하지 않는 객체를 탐지하고 제거하는 기능입니다. 덕분에 자바 개발자는 메모리 누수 걱정 없이 개발할 수 있습니다.
작동 방식
- Mark (마킹): 더 이상 사용되지 않는 객체 탐색
- Sweep (제거): 사용되지 않는 객체 메모리 제거
- Compact (정리): 메모리 조각을 압축하여 공간 확보
GC는 언제 실행되나?
- 시스템이 메모리가 부족할 때
- 명시적으로 System.gc() 호출 시 (하지만 보장되지 않음)
- JVM이 판단했을 때 (백그라운드에서 자동 실행됨)
4. GC가 제거하는 객체의 예시
public class Demo {
public static void main(String[] args) {
Demo obj = new Demo();
obj = null; // 이전 객체는 더 이상 참조되지 않음 → GC 대상
}
}
obj가 null이 되면서 기존 객체는 더 이상 어떤 변수도 참조하지 않게 되어 가비지 컬렉션의 대상이 됩니다.
5. Stop-the-World란?
GC가 작동할 때 모든 스레드가 잠시 멈추는 현상을 Stop-the-World 라고 합니다. 이는 잠깐이라도 애플리케이션이 멈추게 되므로 성능에 민감한 시스템에서는 큰 이슈가 될 수 있습니다.
6. 자바 메모리의 전체 구조 요약
[ JVM 메모리 구조 ]
┌─────────────────────┐
│ Method Area │ ← 클래스 정보, 정적 변수 등
├─────────────────────┤
│ Heap │ ← 객체, 배열
├─────────────────────┤
│ Stack │ ← 지역 변수, 메서드 호출 정보
├─────────────────────┤
│ Native Stack │ ← C 언어 등 네이티브 코드
└─────────────────────┘
마무리 요약
- 자바는 메모리 관리가 자동이지만, 스택과 힙의 구조를 이해하면 성능 최적화에 큰 도움이 됩니다.
- 로컬 변수는 스택, 멤버 변수는 힙에 저장됩니다.
- 가비지 컬렉션은 사용하지 않는 객체를 자동으로 제거하지만, Stop-the-World 등 성능 영향도 고려해야 합니다.
- 메모리 누수를 막고 효율적인 코드를 위해 참조 해제와 GC의 원리를 이해하는 것이 중요합니다.
'Basic' 카테고리의 다른 글
[Backend][Basic] 과적합으로 인한 성능 저하? 오차 줄이는 실전 전략 (0) | 2025.03.25 |
---|---|
[Backend][Basic] 머신러닝/딥러닝 모델 성능 평가 (0) | 2025.03.25 |
[Backend][Basic] 대규모 언어 모델(LLM) 완벽 가이드 (0) | 2025.03.21 |
[Backend][Basic] REST API와 JWT 인증, AWS EC2를 이용한 배포 과정 완벽 가이드 (2) | 2025.03.19 |
149. [Backend] [Jupyter Notebook]: 구글 Colab 사용법 및 활용 예시 (0) | 2025.02.06 |