DEV/cs

[CS] JAVA 가비지 컬렉션(GC)이란

강한 2026. 9. 16. 05:01

자바 가비지 컬렉션이 뭐고 왜 필요한지, Young/Old 영역 구조와 동작 원리를 간단히 정리했습니다.


가비지 컬렉션이란

더 이상 사용하지 않는 객체를 JVM이 자동으로 찾아서 메모리에서 해제해주는 기능입니다. C/C++처럼 개발자가 직접 free()를 호출해 메모리를 해제할 필요 없이, JVM이 "누구도 참조하지 않는 객체"를 판단해서 알아서 치워줍니다.

 
java
Object obj = new Object(); // 힙에 객체 생성, obj가 참조
obj = null; // 참조를 끊음 → 이 객체는 이제 아무도 참조하지 않음(가비지)
// GC가 실행되면 이 객체가 메모리에서 회수됨

가비지인지 어떻게 판단하나

간단히 말하면, 아무 변수도 가리키고 있지 않은 객체가 가비지입니다. 위 예시처럼 obj = null을 하면 그 객체를 가리키던 변수가 없어지므로, JVM은 이 객체를 가비지로 판단합니다.

 
java
class Node {
    Node next;
}

Node a = new Node();
Node b = new Node();
a.next = b;
a = null; // a도, a가 참조하던 b도 이제 GC Root에서 도달 불가능 → 둘 다 가비지

왜 영역을 나눠서 관리하나 (Young/Old)

객체는 대부분 생성된 직후 금방 쓸모없어지고, 일부만 오래 살아남는다는 경험적 사실(약한 세대 가설)을 기반으로, JVM 힙을 두 영역으로 나눠 관리합니다.

  • Young 영역: 새로 생성된 객체가 처음 들어가는 곳. 여기서 자주, 빠르게 GC(Minor GC)가 일어나며 대부분의 가비지가 여기서 정리됩니다.
  • Old 영역: Young 영역에서 몇 번의 GC를 거치고도 살아남은 객체가 옮겨오는 곳(JVM 설정인 MaxTenuringThreshold에 따라 Minor GC를 버텨낸 횟수) . 상대적으로 GC(Major GC/Full GC)가 드물게, 대신 더 오래 걸립니다. 

이렇게 나누는 이유는, 힙 전체를 매번 다 뒤지는 것보다 "금방 죽을 확률이 높은 영역"만 자주 빠르게 훑는 게 훨씬 효율적이기 때문입니다.

 

마무리

메모리 해제를 직접 신경 쓰지 않아도 되지만, 대신 불필요하게 참조를 오래 들고 있으면(예: static 컬렉션에 계속 add만 하는 경우) 객체가 가비지로 판단되지 못해 메모리 누수가 생길 수 있다는 점은 유의해야 합니다.