가비지 컬랙터는 무엇이고 작동원리는?
C언어는 메모리 할당과 해제를 직접 해줘야 했는데, 해지를 까먹으면 유효하지 않은 메모리가 점점 쌓이게 된다
garbage collection
Garbage??
GC란
자바의 메모리 관리 기법, 애플리케이션이 동적으로 할당했던 메모리 영역 중 더이상 사용하지 않는 영역을 정리하는 기능
Stop The World: GC를 수행하기 위해 JVM이 멈추는 현상, GC관련 쓰레드를 제외한 모든 쓰레드는 멈춤
일반적으로 GC 튜닝이라는 것은 멈추는 시간을 최소화 하는 것
JVM 힙 영역이 만들어 질 때 전제
가정 1. 대부분의 객체는 금방 접근 불가능한 상태가 된다
가정 2. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 발생
→ 객체는 대부분 일회성, 메모리에 오래 남아있는 경우는 드물다
객체의 생존 기간에 따라 Young Old 2가지 영역이 생성
Young
Old
Old 영역의 공간이 더 큰 이유
이때, Old 영역에 있는 객체가 Young 영역에 있는 객체를 참조하는 경우도 있을 수 있다.
Minor GC가 참조 여부를 확인할 때 모든 Old 영역을 검사하지 않게 하기 위해 Card Table이라는 걸 도입
카드 테이블만 조회하여 GC 대상인지 확인
Minor GC, Major GC 둘 다 가비지 컬렉션이 실행된다면 2가지 공통 단계를 거친다
Stop The World
Mark and Sweep
Young영역은 1개의 Eden 영역 + 2개의 Survivor 영역으로 나눠짐
Eden: 새로 생성된 객체가 할당되는 영역
Survivor: 최소 한 번의 GC를 살아남은 객체가 존재
Minor GC 과정을 거쳐 이동된 객체로 인해 Old 영역에 메모리가 부족해지면 발생
삭제 되어야 하는 객체를 mark하고 지운다. 메모리가 단편화 되어 있는 상태이므로 이를 한 군데에 모아준다.
일반적으로 young 영역은 작기 때문에 GC가 빨리 끝나 애플리케이션에 영향 많이 안줌
but, Major GC는 Young 영역을 참조할 수 있고 크기도 커서 시간이 오래 걸림