Garbage Collection은 JVM의 Heap영역의 메모리 관리를 하는 방법이다. Heap영역에 생성된 객체 중 Unreachable한 객체들을 수거하여 메모리 공간을 확보한다. 이해가 잘 안된다면 Heap의 동작방법을 먼저 보고 오자.
편의상 Eden : E, Survial0 : S0, Survival : S1로 한다.
MinorGC가 발생. 이때 GC에 의해 수거 되지 않은 객체들은 S0으로 넘어간다.MinorGC가 발생하면 E영역과 S0영역에 수거되지 않은 객체들이 S1으로 넘어간다.Age값이 증가한다.Age값에 도달한 객체들은 Promotion 되는데 Old generation 영역으로 넘어간다는 뜻이다.Old Generation까지 가득 차가되면 MajorGC가 발생한다.용어 정리
- MinorGC : Young Generation에서 발생하는 GC.
- MajorGC : Old Generation에서 발생하는 GC.
- FULLGC : Young Generation + Old Generation 모두 한번에 작업하는 GC.
갓 오브 하이스쿨 291화 중...
GC가 발생하면 JVM은 어플리캐이션 실행을 멈추고 GC를 실행하는 쓰레드만 작동한다. 따라서 System.gc() 메소드는 웬만하면 안쓰는걸 추천한다.
GC가 사용되지 않는 객체들을 정리하는 방법이다. GC가 발생할 때 Heap영역의 객체들 중 외부영역에서 참조되고 있는 객체들한테 marking을 한다. 이 작업을 위해서 Stop the world가 발생한다.
모든 객체의 참조 상태를 확인한 후 mark가 없는 객체들은 sweep을 한다. sweep 후 파편화 된 메모리의 공간을 채워주는 Compact 과정 실행.
Serial GC는 단일 스레드로 동작하는 GC이며, 클라이언트 장비에 최적화된 GC다.
Parallel Young GC는 Minor GC는 Multi Thread로 동작한다.
Parallel Old GC는 Major GC까지 Multi Thread로 동작한다.
CMS GC는 GC 수행 중에 일부 작업을 애플리케이션과 병행하여 처리한다. Stop the world의 시간은 짧아 졌지만 CPU의 자원을 많이 잡아먹는다. java 14부터 미지원.
다른 GC들과는 좀 다르게 생겼다. G1 GC는 Heap영역을 Region 단위로 나누고 각 Region이 Eden, survivor, Old Generation, Humongous를 담당한다. Garbage First란 이름 처럼 garbage가 많은 영역을 우선 GC한다. Stop the world가 가장 짧은 GC로 자바7 부터 사용이 가능하다.
한 줄평 : 각 종류의 GC는 정의 정도만 했는데 실제 동작방법은 한번씩 봐두면 좋을 듯 하다.