JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역을 주기적으로 삭제하는 프로세스이다.
프로그램 개발중 유효하지 않은 메모리(Garbage)가 발생하는데
Java의 경우 JVM의 가바지 컬렉터
가 불필요한 메모리을 알아서 정리해 주기 때문에 개발자가 메모리를 직접 해제해주는 일이 없다.
(java에서는 명시적으로 불필요한 데이터를 표현하기 위해서 null을 선언해준다)
Person person = new Person();
person.setName("Mang");
person = null;
// 가비지 발생
person = new Person();
person.setName("MangKyu");
오버헤드
가 발생한다.JVM의 Heap영역은 처음 설계될 때 다음의 2가지를 전제(Weak Generational Hypothesis)로 설계되었다.
- 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 된다.
- 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.
📌 객체는 대부분 일회성되며, 메모리에 오랫동안 남아있는 경우는 드물다- 참조하는 변수가 사라진다면 이 객체는 필요없는 것으로 간주하고 Garbage Collector에 의해서 할당이 해제 (이러한 객체들을 Unreachable하다고 하며 주기적으로 가비지 컬렉터가 제거해줍니다.)
: 객체의 생존 기간에 따라 물리적인 Heap 영역을 나누었고, Young, Old 2가지 영역으로 설계되었다. 초기에는 Perm 영역이 존재했지만 Java8부터 제거되었다
Young 영역에 대한 가비지 컬렉션(Garbage Collection)을 Minor GC라고 부른다.
Old 영역에 대한 가비지 컬렉션(Garbage Collection)을 Major GC 또는 Full GC라고 부른다.
객체가 Garbage인지를 판단하기 위해 reachability라는 개념을 사용한다.
어떠한 힙 영역에 할당된 객체가 유효한 참조가 있으면 reachability, 없다면 unreachability로 판단.
참고