[JAVA] GC를 알아보자.

무지성개발자·2023년 7월 31일

GC

Garbage Collection은 JVM의 Heap영역의 메모리 관리를 하는 방법이다. Heap영역에 생성된 객체 중 Unreachable한 객체들을 수거하여 메모리 공간을 확보한다. 이해가 잘 안된다면 Heap의 동작방법을 먼저 보고 오자.


GC 프로세스

편의상 Eden : E, Survial0 : S0, Survival : S1로 한다.

  1. 새로운 객체는 E 영역에 할당. 이 시점에서 S0, S1은 비워진 상태.
  2. E영역이 가득차면 MinorGC가 발생. 이때 GC에 의해 수거 되지 않은 객체들은 S0으로 넘어간다.
  3. 계속해서 새로운 객체들은 E영역에 할당. 또 MinorGC가 발생하면 E영역과 S0영역에 수거되지 않은 객체들이 S1으로 넘어간다.
  4. 위 과정을 반복하여 수거되지 않은 객체들은 S0 <-> S1 영역을 왔다갔다하며 이동할 때 마다 Age값이 증가한다.
  5. 일정 Age값에 도달한 객체들은 Promotion 되는데 Old generation 영역으로 넘어간다는 뜻이다.
  6. 계속 해서 위 과정을 반복 반복하다 Old Generation까지 가득 차가되면 MajorGC가 발생한다.

용어 정리

  • MinorGC : Young Generation에서 발생하는 GC.
  • MajorGC : Old Generation에서 발생하는 GC.
  • FULLGC : Young Generation + Old Generation 모두 한번에 작업하는 GC.

GC동작을 직접 모니터링 해보자!


Stop the world


갓 오브 하이스쿨 291화 중...

GC가 발생하면 JVM은 어플리캐이션 실행을 멈추고 GC를 실행하는 쓰레드만 작동한다. 따라서 System.gc() 메소드는 웬만하면 안쓰는걸 추천한다.


Mark and Sweep and Compact

GC가 사용되지 않는 객체들을 정리하는 방법이다. GC가 발생할 때 Heap영역의 객체들 중 외부영역에서 참조되고 있는 객체들한테 marking을 한다. 이 작업을 위해서 Stop the world가 발생한다.

모든 객체의 참조 상태를 확인한 후 mark가 없는 객체들은 sweep을 한다. sweep 후 파편화 된 메모리의 공간을 채워주는 Compact 과정 실행.


GC의 종류

Scrial GC

Serial GC단일 스레드로 동작하는 GC이며, 클라이언트 장비에 최적화된 GC다.

Parallel Young GC

Parallel Young GCMinor GC는 Multi Thread로 동작한다.

Parallel Old GC

Parallel Old GCMajor GC까지 Multi Thread로 동작한다.

CMS GC(Concurrent Mark Sweep GC)

CMS GC는 GC 수행 중에 일부 작업을 애플리케이션과 병행하여 처리한다. Stop the world의 시간은 짧아 졌지만 CPU의 자원을 많이 잡아먹는다. java 14부터 미지원.

G1 GC(Garbage First GC)


다른 GC들과는 좀 다르게 생겼다. G1 GCHeap영역을 Region 단위로 나누고 각 Region이 Eden, survivor, Old Generation, Humongous를 담당한다. Garbage First란 이름 처럼 garbage가 많은 영역을 우선 GC한다. Stop the world가 가장 짧은 GC로 자바7 부터 사용이 가능하다.


한 줄평 : 각 종류의 GC는 정의 정도만 했는데 실제 동작방법은 한번씩 봐두면 좋을 듯 하다.

참고 -
https://aljjabaegi.tistory.com/636

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글