1. 메모리 관리란?
프로그램에 필요한 저장 공간을 할당하고 해제하는 것
목적
- 프로그램 실행에 필요한 데이터를 저장하기 위해 사용
- 효율적인 메모리 사용과 안정성 확보
2. C언어 메모리 관리
특징
- 개발자가 메모리를 직접 다룰 수 있음
대표 함수
- malloc() : 메모리 할당
- free() : 할당된 메모리 해제
장점
- 중간 과정 없이 직접 다루므로 속도가 빠름
- 메모리 사용 효율이 좋음
단점
- 사람이 직접 관리하므로 실수 발생 가능
대표적인 문제
- 메모리 누수(Memory Leak) : 사용이 끝난 메모리를 반납하지 않는 문제
- 해제된 메모리 접근 : 이미 free() 한 메모리를 다시 접근하는 문제
3. Java 메모리 관리
특징
- JVM 실행 시 운영체제로부터 메모리를 할당받음
- JVM이 메모리를 관리함
즉, Java에서는 개발자가 직접 메모리를 할당하거나 해제할 필요가 없습니다.
대신 JVM은 메모리를 크게 Stack과 Heap 두 영역으로 나누어 관리합니다.
4. 스택(Stack)
실행 흐름을 담는 메모리 공간
비유
- 개인 작업대
특징
- 지역변수(Local Variable) 저장
- 메서드 호출 정보 저장
- 메서드 실행 종료 시 자동 반납
- 메모리 관리가 비교적 쉬움
5. 힙(Heap)
공용으로 사용하는 메모리 공간
비유
- 공유 주방
특징
- 객체(Object)와 인스턴스 데이터를 저장
- 메서드 종료 후에도 객체가 바로 사라지지 않음
- 여러 곳에서 함께 참조 가능
왜 스택과 힙을 나누는가?
- 메모리 관리 효율성과 실행 성능 향상을 위해
Stack의 특성
- 빠른 생성 및 제거 가능
- 실행 흐름 관리에 적합
Heap의 특성
- 크기가 큰 데이터 및 객체 저장에 적합
- 여러 객체가 공유 가능
핵심 정리
Stack은 메서드 실행 중심, Heap은 객체 저장 중심
6. GC(Garbage Collector)
힙 메모리 영역에서 더 이상 사용되지 않는 객체를 제거하는 기능
역할
- 참조되지 않는 객체 제거
- 사용 가능한 메모리 확보
- 메모리 누수 방지 도움
동작 기준
객체가 제거되는 경우는 다음과 같습니다.
- GC Root를 기준으로 참조 관계를 탐색했을 때
- 더 이상 참조되지 않는 객체인 경우 제거
GC Root 예시
- 스택의 지역 변수
- static 변수
- JNI 참조 등
동작 과정
- GC Root를 기준으로 참조 관계 탐색
- 사용 중인 객체와 사용되지 않는 객체 구분
- 참조되지 않는 힙 메모리 제거
- 메모리 정리 수행
Stop-The-World
- GC 과정에서 일부 Stop-The-World가 발생할 수 있음
- 이 과정에서 프로그램 실행이 잠시 멈춤
최신 JVM GC인 G1 GC, ZGC, Shenandoah 등의 저지연 GC는 이 정지 시간을 줄이기 위해 지속적으로 개선되고 있습니다.
메모리 압축(Compaction)
- GC는 메모리 압축을 수행하기도 함
- 흩어진 메모리를 정리하여 메모리 단편화(Fragmentation)를 줄임
7. 전체 흐름 요약
Stack
- 메서드 실행을 관리하는 공간
- 지역 변수 저장
- 자동 생성 및 자동 제거
Heap
- 객체를 저장하는 공간
- 여러 곳에서 참조 가능
- GC가 관리
마치며
자바의 메모리 관리는 결국 "개발자 대신 JVM이 알아서 해준다"는 한 문장으로 요약할 수 있습니다.
하지만 그 내부에는 다음과 같은 구조가 숨어 있습니다.
- Stack : 빠르게 생성되고 제거되는 실행 흐름 공간
- Heap : 객체가 살아가는 공유 공간
- GC : Heap을 청소하는 자동 관리자
'CS > Java' 카테고리의 다른 글
| 컴퓨터 언어 정리 (0) | 2026.05.17 |
|---|---|
| Java 기초 정리 (0) | 2026.05.17 |