[기술 면접] 8. GC(Garbage Collection)가 무엇인가요?

GC(Garbage Collection)가 무엇인가요?

저번 시간에 이어, 이번엔 GC(Garbage Collector)가 무엇인지와 그에 대한 질문들을 알아보겠습니다. GC는 면접 단골질문이며 기초 개념으로 정말 중요하다고 할 수 있습니다. 서비스 플랫폼 회사인 K사와 L사, 그리고 게임 회사인 C사에서 마주했던 기억이 납니다.

GC(Garbage Collection)가 무엇인가요?



Q: GC(Garbage Collection)가 무엇인가요?

Garbage Collection으로 JVM의 Heap 영역에서 사용하지 않는 객체를 삭제하는 프로세스를 말합니다.

GC Root로 부터 참조할 수 있는 Reachable Object와 참조가 끊긴 Unreachable Object로 구분하여 탐색하고 삭제를 수행합니다. 이러한 행위를 Mark and Sweep이라고 할 수 있습니다.



Q: GC의 동작(Mark and Sweep)에 대해 더 설명해주실 수 있으실까요?

기본적으로 Mark and Sweep으로 작동합니다. Mark는 GC Root로부터 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹합니다. 이 것을 Reachable Object와 Unreachable Object를 탐색하는 과정이라고 할 수 있고 Sweep으로 Unreachable 객체들을 Heap에서 제거합니다.

추가로 경우에 따라서 Compact과정이 추가되기도 하는데, Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아서 메모리가 할당된 부분과 그렇지 않은 부분으로 나누도록 압축합니다.

image 43



Q: Heap의 구조는 어떻게 되어있나요?

새로운 객체들이 할당되는 영역인 Young Generation과 Young Generation에서 오랫동안 살아 남은 객체들이 존재하는 Old Generation으로 나뉩니다.

추가로 Heap에 존재하진 않지만, Meta space라고 해서 가비지 컬렉션에 필요한 클래스와 메소드의 요약 정보가 존재하는 영역도 있습니다.



Q: Young Generation에서 발생하는 작업을 설명해주세요.

우선, 새로운 객체들이 Eden 영역에 할당되고, 꽉 차면 Minor GC가 발생합니다. 여기서 Mark and Sweep이 발생하고 살아남은 객체들은 Survivor영역으로 이동합니다.

Survivor 영역의 객체들은 age가 증가하고 다시 Eden영역에 객체들이 유입됩니다. 이러한 일련의 동작이 반복 되고, Survivor의 객체들의 age가 특정 임계치에 도달하게 되면, Old Generation으로 이동합니다. 이 것을 Promoted라고 합니다.

Old Generation에도 객체가 꽉 차면 Major GC가 발생하고 Mark and Sweep이 발생합니다.

image 42

Q: 왜 Minor GC와 Major GC로 나누나요?

GC 설계 시, 대부분의 객체는 금방 garbage가 되고, 오래된 객체에서 젊은 객체로의 참조는 드물게 존재한다는 가설을 기준으로 만들었습니다.



Q: Stop-The-World란 무엇인가요?

GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것입니다. 즉, GC 실행 쓰레드 외의 모든 쓰레드가 작업을 중단합니다.



Q: GC의 종류와 Java 버전 별 default GC들을 말씀해 보세요.

Serial GC

  • 순차적 GC라는 의미로, Mark/Sweep/Compaction 알고리즘이 한 번에 하나씩만 작동합니다. 가장 오래된 GC이며, Stop-The-World 시간이 길기 때문에 최근에는 잘 사용되지 않습니다.
    • 싱글 스레드나 협소한 Heap 영역 환경에서 사용됩니다.

Parallel GC  Java 7, 8

  • 멀티 스레드로 Mark-Sweep-Compaction을 수행하기 때문에 Stop-The-World 시간이 짧습니다.

CMS GC

  • Concurrent-Mark-Sweep으로 Stop-The-World 시간을 최소화하기 위해 고안됐습니다.
    • 대부분의 Garbage 수집 작업을, Application Thread와 동시에 수행하여 Stop-The-World 시간을 줄일 수 있습니다.
    • 메모리와 CPU를 많이 사용하고 Compaction이 기본적으로 제공되지 않는다는 단점이 있습니다.
    • G1 GC 등장으로 대체되었습니다.

G1 GC – Java 9 이상

  • Garbage First의 줄임말입니다. Heap을 일정 크기의 Region으로 나누어, Young Generation과 Old Generation을 구분하고, 필요에 따라 개수를 가변적으로 변경하여 Stop-The-World를 최소화합니다.



마치며

이번 시간엔 GC에 대한 다양한 질문들을 준비해보았습니다. 생각보다 내용이 깊고 다양하여 처음엔 어려울 수 있지만, 중요한 내용이니 반드시 준비하시길 권해드립니다. GC의 구조와 작동 방법을 말로 표현할 수 있게 된다면, 나름의 재미를 느끼실 수 있을 것으로 생각합니다.

다음 시간에는 직렬화에 대한 면접 질문을 알아보겠습니다.

Java Generic 타입에 대해서 설명해주세요.

Leave a Comment