2023년 12월 25일
2024년 1월 1일
자바의 가비지 콜렉션은 자바의 메모리 관리 기법 중 하나로, 동적으로 할당된 메모리 영역 중 사용되지 않는 영역을 자동적으로 회수하고 관리하는 프로세스이다.
C, C++ 에서는 개발자가 직접 객체의 생성과 파괴를 해줘야한다. 만약 개발자가 쓸모없는 객체 파괴를 잊어버린다면?
시스템의 메모리는 계속 증가할 것이며 결국 메모리 누수가 발생한다. 특정 시점이 지나면 더 이상 새로운 객체를 생성하는 데 메모리를 사용할 수 없으며, 결국 메모리 부족 오류로 전체 애플리케이션이 종료될 수 있다.
하지만, 자바에서는 JVM이 구성된 JRE가 제공되며, 그 구성요소 중 하나인 Garbage Collection이 자동으로 사용되지 않는 객체를 파괴한다.
GC에 대해 더 알아보기 전에, stop-the-world를 알아야한다. stop-the-world란 GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다.
어떤 알고리즘을 사용하더라도 stop-the-world는 발생하게 되는데, 대개 GC 튜닝은 stop-the-world 시간을 줄이는 것이다. (이 시간동안 사용자 요청을 처리할 수 없으므로) GC를 해도 더 이상 사용 가능한 메모리 영역이 없는데 계속 메모리를 할당하려고 하면 OutOfMemoryError가 발생하여 웹 애플리케이션 서버(WAS)가 다운을 초래할 수 있다.
기본적으로 JVM의 메모리는 총 5가지 영역 (class, stack, heap, native method, PC)으로 나뉘는데, GC는 힙 메모리만 다룬다.
가비지 컬렉션의 대상이 되는 객체는 주로 다음과 같은 경우에 해당된다:
객체에 null을 할당하면 해당 객체에 대한 모든 참조가 제거되고, 가비지 컬렉션의 대상이 된다.
예를 들어, Object obj = new Object(); 이후 obj = null;이 실행되면 obj가 가리키는 객체는 가비지 컬렉션의 대상이 된다.
메서드 내에서 생성된 지역 변수는 메서드가 종료되면 스코프를 벗어나게 된다. 이 경우에도 해당 객체는 가비지 컬렉션의 대상이 된다.
예를 들어, 메서드 내에서 Object obj = new Object();가 실행되고, 메서드가 종료되었다면 obj가 가리키는 객체는 가비지 컬렉션의 대상이 된다.
부모 객체가 없어지면 자식 객체들은 더 이상 접근할 수 없게 된다.
예를 들어, List<Object> list = new ArrayList<>(); 이후 list = null;이 실행되면, list가 가리키는 ArrayList와 그 안의 모든 객체는 가비지 컬렉션의 대상이 된다.
가비지 컬렉션 과정은 크게 '마킹', '노멀 딜리션', 그리고 '컴팩팅' 세 단계로 나뉜다.

reachable로 표시되고, 사용되지 않는 메모리는 unreachable로 표시된다.
unreachable로 표시된 메모리를 해제하는 노멀 딜리션 단계를 진행한다.
객체 생명주기에 따라 메모리를 관리한다?
자바의 가비지 컬렉션은 힙 메모리를 세 가지 부분으로 나눠 관리한다.

새롭게 생성한 객체의 대부분이 여기에 위치한다. Eden과 Survivor 영역으로 나뉘는데, 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에서 객체가 사라질 때 Minor GC가 발생한다고 말한다.
Young 영역에서 살아남은 객체들이 이동하는 영역이다. 이 영역에서 객체가 사라질 때, Major GC 혹은 Full GC가 발생한다고 말한다. 크기가 큰 만큼 Young 영역보다 GC는 적게 발생하지만 Young 영역에 비해 Stop-The-World가 길어질 수 있다.
Method 영역이라고도 하는데, JVM에 의해 사용되는 클래스나 메소드에 대한 메타 정보가 저장되는 영역이다.
| 단계 | 설명 |
|---|---|
| 1. 객체 생성 | 새로운 객체가 생성되면, 처음에는 Young Generation의 Eden Space에 할당된다. |
| 2. Minor GC | Eden Space가 가득 차면, Minor GC가 시작된다. 여전히 참조되는(reachable) 객체들은 Survivor Space로 이동하고, 참조되지 않는(unreachable) 객체들은 Eden Space가 clear될 때 반환된다. |
| 3. Survivor Space | 다음 Minor GC가 실행될 때, Eden Space에서 살아남은 객체는 Survivor Space로 이동한다. 이 과정은 Minor GC가 실행될 때마다 반복된다. |
| 4. Major GC | Young Generation에서 살아남은 객체들은 Old Generation으로 이동한다. Old Generation 영역에서 객체가 사라질 때 Major GC(또는 Full GC)가 발생한다. |
| 5. Permanent Generation | JVM에 의해 사용되는 클래스나 메소드에 대한 메타 정보가 저장되는 영역이다. |
reachability 개념을 사용한다. 사용 중/사용중이지 않은 메모리를 reachable, unreachable로 판단한다고 정리했다. 힙 메모리에 할당된 객체가 다른 루트객체에 의해 참조되지 않는 경우, 즉 unreachable일 경우 ‘가비지’로 판단된다.reachable, 즉 계속 참조되고 있는 객체는 살아있는 것으로 판단하고, Old Generation 영역으로 이동하게 된다.2024년 1월 2일
reachable로 표시되고, 사용되지 않는 메모리는 unreachable로 표시된다.