자바 쓰면서 GC가 알아서 메모리 정리해준다는 건 아는데, 정확히 어떤 원리로 안 쓰는 객체를 찾아내는지가 늘 궁금했어요.


처음엔 참조 카운팅 같은 걸로 세는 줄 알았는데, 그러면 서로 참조하는 순환참조는 못 잡는다고 하더라고요. 그래서 요즘 GC는 그렇게 안 하고 도달 가능성으로 판단한다는 것 같은데, 이게 루트에서부터 따라갈 수 있는 객체만 살리고 나머지는 지운다는 뜻인가요?


Mark하고 Sweep 두 단계로 나눈다는 것도 봤는데, Mark가 살아있는 걸 표시하고 Sweep이 표시 안 된 걸 지우는 거 맞나요?


그리고 세대별 GC라는 것도 나오던데, 새로 만든 객체는 Young 영역에 두고 오래 살아남으면 Old로 옮긴다는 거요. 대부분 객체가 금방 죽는다는 가정 때문이라는데, 이게 Minor GC가 짧고 자주 도는 이유인가요?


마지막으로 Stop-the-World가 모든 스레드를 멈추는 거라는데, 그럼 Minor GC 돌 때도 매번 멈추는 건가요? 아니면 그건 안 멈추고 도는 건지 헷갈려요.