본문 바로가기
Daily Dev Q&A 정리 템플릿

25.11.25 JAVA의 GC(Garbage Collection)

by teg0 2025. 11. 25.

GC(Garbage Collection)

먼저, 가비지 컬렉션과 가비지 컬렉터에 대해 간단하게 말하자면, 가비지 컬렉션은 프로그램 종료하기 전에 메모리 누수를 방지하기 위해 자동으로 메모리를 관리하는 작업이고 가비지 컬렉터는 자동으로 메모리를 관리하는 프로세스 또는 시스템이다.

 

장점

C, C++ 언어에서는 가비지 컬렉션이 없어 프로그래머가 수동으로 메모리 할당과 해제를 일일이 해줘야 한다.

하지만, JAVA, 파이썬, 자바스크립트, GO 언어에 기본으로 내장되어 있는 가비지 컬렉터가 존재하기 때문에 프로세스가 한정된 메모리를 효율적으로 사용할 수 있게, 자동으로 관리해 준다.

 

단점

자동으로 처리해 주지만, 메모리가 언제 해제되는지 정확하게 알 수 없어 제어하기 힘들며, 가비지 컬렉션이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생한다.

 

Stop-the-world

GC를 실행하기 위해 JVM이 멈추는 현상을 의미하며, GC가 작동하는 동안 GC 관련 스레드 제외한 모두 멈춘다.

따라서 이 멈추는 시간을 최소화시키는 것이 중요하는데 이런 GC 최적화 작업을 GC 튜닝이라고 한다.

 

가비지 컬렉션 대상

가비지 컬렉션 대상이 되는 기준은 도달능력(Reachability)이라는 개념을 적용한다.

객체에 참조가 되어 있다면 Reachable로 구분되고 없다면 Unreachable로 구분해 버리고 수거한다.

 

가비지 컬렉션이 메모리를 관리하는 방식

위에서 본 가비지 컬렉션이 대상을 지정하면, Mark-Sweep 내부 알고리즘 방식으로 메모리를 관리한다.

가비지 컬렉션이 될 대상 객체를 식별(Mark)하고 제거(Sweep)하며, 객체가 제거되어 파편화된 메모리 영역을 앞에서부터 채워나가는 작업을 수행한다.

  • Mark 과정은 Root Space로부터 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체를 참조하는 지를 스캔한 후 참조하지 않은 객체를 마킹한다.
    이때 도달성(능력)을 검사하고 Heap 영역 중 Young Gen 위주로 수행된다.
  • Sweep 과정은 참조하지 않은 객체 즉, Unreachable 객체들을 Heap 메모리에서 제거한다.
  • Compact 과정은 Sweep 후에 분산된 객체들을 Heap 메모리의 시작 주소로 모아 메모리가 할당된 부분과 할당되지 않은 부분을 압축한다.(빈 공간이 없도록.) 

JVM GC의 Root Space는 Heap 메모리 영역을 참조하는 메서드 영역, Static 변수, 스택 영역, 네이티브 메서드 스택 영역이 된다.

 

자바 Heap 구조와 GC의 관계

JVM의 Heap은 크게 Young Gen과 Old Gen으로 나뉜다.

  • Young Gen새로 생성된 객체들이 저장되는 영역으로 대부분 빨리 사라진다.
    내부에는 Eden, Survivor(S0/S1) 영역이 있다.
  • Old Gen여러 번 GC를 살아남아 장기간 유지되는 객체를 저장하는 영역이다.

이 두 영역에 따라 GC는 다르며, 상황에 따라 GC가 하는 작업이 달라진다.

  • Young GC 발생하는 이유는 Young Gen 영역 중 Eden 공간이 꽉 찼을 때 대부분 객체가 제거된다.
  • Old GC/Major GC 발생하는 이유는 Old Gen의 사용량이 특정 임계치를 넘었을 경우인데, Young Gen에서 계속 생존한 객체가 Old로 승격하면서 장기 객체가 되기 때문이다.(Eden -> Survivor)
  • Full GC 발생하는 이유는 JVM에서 도저히 Old GC만으로 해결할 없거나, Heap 전체를 강제로 회수해야 하는 상황(Old Gen 부족, Metaspace 부족, Promotion 실패, System.gc 호출 등)이 발생할 때 실행된다.
    Full GC의 범위는 Young, Old, Metaspace 전체를 대상으로 한다.

Metaspace는 Heap 영역이 아닌 네이티브 메서드 스택 영역을 사용하며, 클래스 정의 자체를 저장한다.

이 영역은 너무 많은 클래스를 동적으로 생성하는 경우(Spring / Hivernate 프록시)가 있다.

 

Promotion 실패는 Heap 영역에서 Young Gen에서 Old Gen으로 객체를 승격시키는 과정을 실패할 때를 뜻한다.

 

면접 답변식 요약

가비지 컬렉션은 개발자가 개발에 집중할 수 있도록 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체를 모아 주기적으로 제거하는 작업이다. 가비지 컬렉션은 이 객체가 여전히 접근 가능한 상태(도달 능력)를 기준으로 판단한다.

객체가 더 이상 참조하지 않을 경우 Unrachable로 Mark하고 Sweep과정을 통해 Heap 메모리에서 제거한 후 Heap메모리를 압축한다.

 

참고 문헌

https://www.google.com/url?sa=i&url=https%3A%2F%2Fcoding-factory.tistory.com%2F829&psig=AOvVaw0MEo7ZtrMUMkXWxXkaUgXB&ust=1764138975443000&source=images&cd=vfe&opi=89978449&ved=0CBUQjRxqFwoTCOinxP3XjJEDFQAAAAAdAAAAABAE

 

리디렉션 알림

 

www.google.com

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC

 

☕ 가비지 컬렉션 동작 원리 & GC 종류 💯 총정리

Garbage Collection(GC) 이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객

inpa.tistory.com