우매함의 봉우리를 넘어서며 개발하면서 기록하기

가비지 컬렉션(Garbage Collection)

들어가기 전에


Java 이전에 나왔던 언어인 C/C++의 경우 메모리 누수를 방지하기 위해 사용하지 않은 객체는 개발자가 직접 해제를 해주어야 했다. 하지만 Java에서는 JVM이 대신 이 작업을 해준다. 이때, 사용하지 않는 객체를 메모리에서 삭제하는 작업을 GC라고 부르며 JVM이 GC를 수행한다.

Garbage Collection


JVM의 메모리는 총 5가지 영역(class, stack, heap, native method. PC)로 나뉘어진다. GC는 이 영역들 중 힙 메모리만 관리한다.

GC의 대상이 되는 경우는

  1. 객체가 NULL인 경우String str = null
  2. 블럭에서 생성된 객체가 있고 이 블럭이 실행 종료될 경우
  3. 부모 객체가 NULL인 경우 그에 포함되는 자식 객체

GC의 메모리 해제 과정


GC는 기본적으로 힙 영역에서 가비지(garbage)를 찾아내 힙의 메모리를 회수하는 과정을 거친다. 이때, 이 관리를 좀더 효율적으로 하기 위하여 Young 영역과 Old 영역으로 메모리를 분할해 새로 생성되는 객체는 Young 영역에 보관하고 오랫동안 살아남은 객체는 Old 영역에 보관하여 관리합니다.

GC

Minor GC


새로 생성되는 대부분의 객체는 금방 사용하지 않는 상태가 되기 때문에 Eden 영역에 위치하게 된다. 이 영역에서 GC가 일어나 객체가 사라지는 과정을 Minor GC라고 이야기한다. Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역으로 이동하게 되고 이 과정을 계속해서 거치면서 일정 시간동안 살아남게 되면 Old 영역으로 이동하게 된다.

Major GC


Young 영역에서 살아남은 객체는 Old 영역으로 이동하게 되며 대부분 Young 영역 때에 비해 크기가 크게 할당되게 된다. 이 Old 영역에서 객체가 사라질 때 Major GC가 발생한다고 말한다.

정리


Java GC를 정리하자면 새로 생기는 객체와 오래 유지되는 객체를 나누어 메모리에 저장함으로써 메모리의 누수를 줄이고 효과적으로 메모리를 관리해주는 역할을 하는 녀석이다. 이 GC 동작을 잘 이해해야 Java의 heap 메모리 문제에서 더 유연한 애플리케이션을 만들 수 있는 첫걸음이 된다고 생각한다.

참조

Garbage Collection 과정

더욱 자세한 Garbage Collection 설명