Java & Spring/자바가상머신(JVM)

Garbage Collection과 메모리 누수

승주우에요 2026. 1. 6. 20:48

GC의 Generation 구조

 

1. GC란 무엇인가

더 이상 사용되지 않는 객체를 자동으로 메모리에서 제거하는 JVM의 자동화 메커니즘이다. C/C++과 달리 Java에서는 개발자가 직접 메모리를 해제하지 않는다. 

 

주의사항

  • GC는 안쓰는 객체를 판단하지 않는다
  • 참조되지 않는 객체만 제거한다

2. GC가 객체의 생존을 판단하는 기준

객체의 논리적 사용 여부를 보지 않고, 오직 참조(reference)만 본다

 

GC Root란?

GC는 특정한 시작점에서 참조를 따라가며 객체를 추적한다. 이때 시작점을 GC Root라고 한다.

 

대표적인 GC Root:

  • stack에 있는 참조 변수
  • static 변수
  • JNI 참조

📌 GC Root에서 도달 가능한 객체는 모두 살아 있는 객체이다. 즉 , 실제로 사용 안 해도 참조만 남아 있으면 GC 대상이 아니다

 

3. JVM Heap과 GC의 관계

GC는 Heap 영역만 관리한다. Stack, Method Area는 GC 대상이 아니다.

 

4. Young GC (Minor GC)

특징 

  • Eden 영역 중심
  • 매우 자주 발생 
  • 빠르고 비용 낮음

동작 개념

  1. Eden에 객체 생성
  2. Eden이 가득 차면 GC 발생
  3. 살아남은 객체는 Survivor로 이동
  4. 일정 횟수 생존 시 Old로 이동

📌 대부분의 객체는 Young에서 생성되고 바로 사라짐

 

5. Old GC

특징 

  • Old 영역 포함
  • 발생 빈도 낮음
  • 비용이 매우 큼
  • 성능에 큰 영향을 미침
  • Young GC가 대부분의 객체를 처리하기 때문에 Old GC는 자주 발생하지 않음

 ** GC는 자동 정리 도구이지, 설계 실수를 보완해주는 도구가 아니다 !

 

6. Java에서 메모리 누수란 무엇인가

Java에서 메모리 누수는 더 이상 사용되지 않지만, 참조 때문에 GC되지 않는 객체라고 정의된다. 즉, 메모리는 늘어나고 GC는 열심히 도는데 객체는 줄지 않는 상태를 말한다.

 

📌 Java의 메모리 누수는 해제 실패가 아닌, 참조 관리 실패이다.

 

7. 메모리 누수의 대표적인 원인들

1️⃣ static 컬렉션

static List<Object> list = new ArrayList<>();

static은 JVM 종료까지 살아 있음 + list에 담긴 객체들도 함께 살아 있음

 

2️⃣ 해제하지 않은 Listener / Callback (이 부분은 추후에 공부)

  • 이벤트 리스너
  • 옵저버 패턴
  • 콜백 등록 후 해제 누락

8. 메모리 누수 방지 사고 방식

"이 객체를 누가 언제까지 들고 있는가?" 라는 질문을 끝까지 들고 있어야 한다.

 

9. 메모리 누수 방지 전 

  • static에 상태 저장 금지
  • 컬렉션 생명 주기를 명확히
  • 필요 없는 참조는 끊기
  • 캐시는 크기/시간 제한

GC를 믿지 말고 참조를 관리하자!!

 

10. 요약

  • GC는 Heap만 관리한다
  • GC는 참조 기준으로 객체 생존을 판단한다
  • Java의 메모리 누수는 참조 관리 문제이다
  • static은 가장 흔한 누수 원인이다

'Java & Spring > 자바가상머신(JVM)' 카테고리의 다른 글

JVM 메모리 구조  (0) 2026.01.06
JVM이란 무엇이고, 어떻게 실행되는가  (0) 2026.01.06