가비지 컬렉션(Garbage Collection)
힙 영역에서 사용하지 않는 객체들을 제거하는 작업
- 이 객체를 제거하는 작업이 필요한 이유는 자바는 개발자가 메모리를 직접 해제해줄 수 없는 언어이기 때문
GC의 동작방식
가장 기본적인 알고리즘인 Serial GC 방식을 알아보자
(좀 더 진보된 GC는 G1 GC, ZGC가 있음)
- GC는 Minor GC, Major GC로 구분됨
- Minor GC는 young 영역에서, Major GC는 old 영역에서 일어난다고 정의
- GC를 수행할 때는 GC를 수행하는 스레드 이외의 스레드는 모두 정지하며, 이를 Stop-the-world라고 함
Minor GC
- young 영역에서 일어남
- Eden 영역이 가득 참에서 부터 시작
- Eden 영역에서 참조가 남아있는 객체를 mark하고 survivor 영역으로 복사하고 비움
- Survivor 영역도 가득차면 같은 방식으로 다른 Survivor 영역에 복사하고 비움
- 이를 반복하다 보면 계속 해서 살아남는 객체는 old 영역으로 이동
Major GC
- old 영역에서 일어남
- 위와 반대로 삭제되어야 하는 객체를 mark하고 지움(sweep)
- 메모리는 단편화 된 상태이므로 이를 한 군데에 모아주는 것을 Compaction이라 하며 compact라고 함
- 그래서 Mark-Sweep-Compact 알고리즘이라고 함
- 이것이 중요한 이유는 GC 수행시 시스템이 멈추기 때문에 의도치 않은 장애의 원인이 될 수 있음.
- 따라서 이를 위해 힙 영역을 조정하는 것을 GC 튜닝이라고 하고 JVM 메모리는 절대 마음대로 조정해선 안됨!