
가비지 컬렉터의 세대 개념에 대해 설명해주세요.
컬렉션 방식:
Minor GC (또는 Scavenge GC): Young Generation에서 발생하는 가비지 컬렉션을 Minor GC라고 합니다. 이 공간은 대부분의 객체가 금방 죽으므로, 살아있는 객체만 식별하여 다른 공간으로 이동시키는 방식으로 컬렉션이 진행됩니다.
컬렉션 빈도: 매우 자주 발생합니다. 짧은 시간 내에 많은 객체가 생성되고 소멸되기 때문입니다.
Stop-the-world: Minor GC는 상대적으로 빠르게 끝나므로 애플리케이션의 일시 중지(Stop-the-world) 시간이 짧거나 거의 감지되지 않을 수 있습니다.
구성: 일반적으로 Eden, Survivor1, Survivor2 세 개의 영역으로 구성됩니다.
Eden Space: 객체가 처음 생성되는 공간입니다.
Survivor Space (S0, S1): Eden Space에서 Minor GC 이후 살아남은 객체들이 이동하는 공간입니다. 두 개의 Survivor Space를 두어 한쪽 공간이 꽉 차면 다른 공간으로 옮겨가면서 단편화를 방지하고 오래된 객체들을 분류합니다.
컬렉션 방식:
Major GC (또는 Full GC): Old Generation에서 발생하는 가비지 컬렉션을 Major GC라고 합니다. 이 공간은 객체 수가 많고 수명이 길기 때문에 Minor GC보다 훨씬 많은 시간과 자원을 소모합니다.
컬렉션 빈도: Young Generation에 비해 훨씬 드물게 발생합니다.
Stop-the-world: Major GC는 일반적으로 애플리케이션의 상당한 일시 중지(Stop-the-world)를 유발할 수 있습니다. 이는 성능 저하의 주요 원인이 될 수 있으므로 최소화하는 것이 중요합니다.
JVM 버전별 차이:
Java 7 이하: PermGen(Permanent Generation)이라고 불렸으며, 고정된 크기를 가지고 있어 OutOfMemoryError를 발생시키는 원인이 되기도 했습니다.
Java 8 이상: PermGen이 사라지고 Metaspace로 대체되었습니다. Metaspace는 기본적으로 네이티브 메모리를 사용하며, 필요한 만큼 자동으로 확장됩니다 (단, 최대 크기를 설정할 수는 있습니다).
컬렉션 방식: 메타데이터는 일반적으로 애플리케이션이 종료될 때까지 유지되므로, 이 공간에서의 GC는 매우 드물게 발생합니다.