본문 바로가기

자바

Garbage Collection

메모리를 명시적으로 해제하지 않아도 메모리 할당 받은 객체를 참조하는 부분이 없는 경우 Garbage Collector를 통해 자동으로 관리 해줌

 - 사용한 객체를 null로 지정하지 않아도 됨

 -  System.gc() 를 호출하면 문제가 커짐 (필요 없는 상황에서 Full GC가 수행 됨...)

Stop-the-world : GC를 수행하기 위해 JVM이 Application을 멈추는 것 (GC를 수행하는 Thread 제외하고 모든 Thread의 작업을 멈춤)

 - GC 튜닝이라는 것은 결국 Stop-the-world 시간을 줄이는 것인데, 이건 Major GC(Full GC)와 관련이 있음


Heap Memory에는 Young 영역과 Old 영역이 존재함

 1. Young 영역

  - 새로 생긴 객체가 위치함

  - Eden(1), Survivor(2) 총 3개의 영역으로 존재함

  - Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동 (Minor GC)

  - Eden 영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 객체가 계속 이동

  - 하나의 Survivor 영역이 가득 차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동 후 가득 찬 Survivor 영역은 비움

  - 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동

 2. Old 영역

  - 오래된 객체가 위치함

  - 데이터가 가득 차면 GC가 발생 (Major GC)

 

Garbage Collector 종류

1. Serial GC (-XX:+UseSerialGC)

 - Mark-Sweep-Compaction 알고리즘 사용

  - Old 영역에 살아 있는 객체를 식별(Mark)

  - Heap 영역의 앞 부분부터 확인하여 살아 있는 것만 남김(Sweep)

  - 각 객체들이 연속되게 쌓이도록 힙의 가장 앞 부분부터 채워서 객체가 존재하는 부분과 객체가 없는 부분으로 나눔(Compaction)

2. Parallel GC (-XX:+UseParallelGC)

 - Serial GC와 같은 알고리즘을 사용하지만 parallel 하게 수행 됨

 - 메모리가 충분하고 코어의 개수가 많을 때 사용하면 좋음

3. Parallel Old GC (-XX:+UseParallelOldGC)

 - Mark-Summary-Compaction 알고리즘 사용

 - Summary 단계는 이전 GC의 Compaction 단계에서 살아남은 영역을 먼저 인덱싱 한 후 Sweep 단계를 수행(메모리를 조금 더 소모함)

4. CMS GC (-XX:+UseConcMarkSweepGC)

 - Concurrent Mark and Sweep 알고리즘 사용

 - ROOT set 에 의해 직접 참조되는 객체들을 Marking (Initial Mark)

 - 애플리케이션 동작 중 작업하며 살아있는 객체 식별 (Concurrent Mark)

 - 위에서 추가로 참조가 끊긴 객체를 확인 (Remark)

 - 참조가 끊긴 모든 쓰레기 정리 (Concurrent Sweep)

 - 모든 작업은 독립 쓰레드가 병렬로 처리

 - Compaction 단계는 기본으론 제공하지 않음

 - 조각난 메모리가 많아 Compaction 단계가 수행 되면 기존 보다 더 긴 Stop-the-world가 발생

5. G1 GC (-XX:+UseG1GC)

 - Heap 영역을 작은 region으로 나누어 관리 (Young(Eden, Survivor) 영역과 Old 영역이 분리 되지 않음)

 - -XX:MaxGCPauseMillis=value 를 통해 Stop-the-world 의 시간을 조절할 수 있음 (default:200ms)

 - GC 동작 방식은 CMS GC 알고리즘과 같음

 - 4GB 이상의 메모리를 사용할 경우에 사용해야 효율이 좋음


[참조]

https://d2.naver.com/helloworld/1329

https://www.slipp.net/wiki/pages/viewpage.action?pageId=26641949

'자바' 카테고리의 다른 글

ThreadLocal  (0) 2020.10.12
JVM 메모리 구조  (0) 2019.02.08