더이상 참조 되지 않는 Garbage(가비지)라고 불리는 불필요한 메모리를 알아서 정리해주는 역할을 한다.
가비지 컬렉터가 주기적으로 메모리 누수를 방지하기 위해 메모리를 청소하는 과정을 Garbage Collection(=GC)라고 한다.
힙 영역에서 참조되지 않은 데이터를 삭제하는 역할을 해서, 개발자가 직접 참조하지 않는 데이터를 삭제하지 않아도 된다. (개발자의 불편을 많이 덜어줌)
하지만, 개발자는 메모리가 언제 해제되는지 정확하게 알 수 없고, 가비지 컬렉션(GC)이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생한다.
-> GC가 동작하는 동안 다른 동작을 멈추는 것을 Stop-the-world라고 하며, 어떤 GC알고리즘이든 stop-the-world가 발생한다. (GC를 실행하는 스레드를 제외하고 나머지 스레드들의 모든 작업을 멈춘다. GC 작업이 완료되면 다시 중단된 작업들을 수행한다.)
객체(new연산자를 사용하는)들은 실질적으로 Heap 영역에서 생성되고 Method Area이나 Stack Area등 Root Area에 생성된 객체의 주소만을 참조하는 형식으로 구성된다.
Heap Area 객체들을 참조하던 Method Area의 객체나 Stack Area의 객체가 메소드가 끝나느 등의 특정 이벤트들로 인해 Heap Area 객체의 메모리 주소를 참조하고 있는 참조 변수가 삭제되는 현상이 발생하면, 이 객체를 Unreachable이라고 하며 주기적으로 가비지 컬렉터가 제거해준다.
Heap Area는 new 키워드로 생성된 객체와 배열이 생성되는 영역이다.
주기적은 GC가 제거하는 영역이다.
Heap Area는 효율적인 GC를 위해 위의 사진과 같이 3가지의 여역으로 나눈다.
Young Generation 영역은 자바 객체가 생성되자마자 저장되고, 생긴지 얼마 안되는 객체가 저장되는 공간이다.
Heap 영역에 객체가 생성되면 최초로 Eden 영역에 할당된다.
Eden영역에 데이터가 어느정도 쌓이게 되면 참조정도에따라 Servivor의 빈 공간으로 이동되거나 회수된다.
Young Generation(Eden+Servivor) 영역이 차게 되면 또 참조정도에따라 Old 영역으로 이동이 되거나 회수가 된다.
Young Generation과 Tenured Generaction에서의 GC를 Minor GC라고 한다.
Old 영역에 할당된 메모리가 허용치를 넘기게 되면 Old 영역에 있는 모든 객체들을 검사하여 참조되지 않는 객체들을 한꺼번에 삭제하는 GC가 실행된다.
이때, Stop-the-world이 발생하며, Old 영역의 메모리를 회수하는 GC를 Major GC라고 한다.