자바는 메모리 관리를 개발자가 아닌 GC(가비지콜렉터)라는 쓰레드를 생성하여 사용하지 않는 객체를 제거합니다. 일반적으로는 JVM에 의해 자동으로 GC가 실행됩니다.
Garbage Collector
- Heap영역에 생성된 객체들의 메모리 관리를 담당한다.
- 더 이상 사용되지 않는 객체를 점검하여 제거한다
- JVM에 의해 자동적으로 실행되며 CPU가 상대적으로 여유롭거나 메모리가 부족할 때 실행된다.
- GC를 수행하는 동안은 GC를 수행하기 위한 쓰레드 외의 모든 쓰레드작업이 멈추기 때문에 시스템에 큰 영향을 미치게 된다.
![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/b5c9414f-5a6e-4d3a-9a9e-d6f8509b8d8e/Untitled.png)
가비지콜렉션은 일반적으로 객체사용시간에따라 세대를 구분한다.
Young 영역(Young Generation)
- 새롭게 생성된 객체가 할당(Allocation)되는 영역
- 대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다.
- Young 영역에 대한 가비지 컬렉션(Garbage Collection)을 Minor GC라고 부른다.
Old 영역(Old Generation)
- Young영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
- 복사되는 과정에서 대부분 Young 영역보다 크게 할당되며, 크기가 큰 만큼 가비지는 적게 발생한다.
- Old 영역에 대한 가비지 컬렉션(Garbage Collection)을 Major GC 또는 Full GC라고 부른다.
예외적인 상황으로 Old영역에 위치한 객체가 Young영역에 위치한 객체를 참조하는 경우도 있을 것이다. 이경우를 위해 자바에서는 카드테이블을 만들어 Old영역에 있는 객체가 Young영역의 객체를 참조할 때마다 그에대한 정보를 표시한다. 따라서 Young영역에서는 가비지컬렉션이 진행될 때 카드테이블만을 조회하며 GC의 대상인지 식별할 수 있다.