← 질문 목록
#32깊이 0
가비지 컬렉션이 멈춤을 만드는 이유는?
살아 있는 객체를 세는 동안 그 관계가 바뀌면 안 되기 때문이다. 세는 중에 애플리케이션이 참조를 바꾸면 이미 확인한 것이 틀려져서, 그 구간만은 실행을 세운다.
- Eden새 객체가 여기 태어난다. 대부분 금방 죽는다
- Survivor한두 번 살아남은 것이 잠시 머문다
- Old오래 산 것이 승격된다. 여기 청소가 비싸다
대부분의 객체는 태어나자마자 죽는다. 그래서 젊은 영역만 자주 짧게 치우고 늙은 영역은 가끔 손댄다. 젊은 쪽 청소는 보통 밀리초 단위라 눈에 안 띈다.
문제는 늙은 영역이다. 대상이 많고 흩어져 있어 오래 걸리고, 그동안 응답이 멈춘다. 힙을 키우면 빈도는 줄지만 한 번의 멈춤은 길어진다 — 총량과 최악값의 맞바꿈이다.
요즘 수집기는 세는 일 대부분을 실행과 겹쳐서 한다. 멈추는 구간을 시작과 끝의 짧은 두 번으로 줄이는 방식이다. 완전히 없애지는 못한다.
추천 꼬리질문
관련 질문
- 순환 참조 객체도 회수할 수 있는 이유는?언어 · 런타임순환 참조 해결을 위한 마킹 단계 등 GC의 작동 방식은 멈춤 현상이 발생하는 근본적인 원인과 연결된다.
- 수집기는 처리량과 지연 중 무엇으로 고르는가?언어 · 런타임GC의 멈춤 현상은 지연 시간(latency)과 직결되며, 수집기 선택 시 처리량과 지연 사이의 트레이드오프를 결정하는 기준이 된다.
- 참조 횟수가 0이 아닌 객체도 왜 수거되는가?언어 · 런타임참조 횟수 기반 GC와 추적 기반 GC의 차이는 멈춤 현상의 발생 빈도와 범위에 영향을 준다.
- JVM 메모리 영역은 어떻게 구분하는가?언어 · 런타임JVM 메모리 영역(특히 Young/Old Generation)의 관리 방식은 GC 멈춤 현상의 직접적인 원인이 된다.
- 파이썬의 가비지 컬렉션은 무엇으로 동작하는가?언어 · 런타임둘 다 가비지 컬렉션의 동작 방식과 그로 인한 영향인 멈춤 현상에 대해 다룬다.