GC

  • java에서 버려진 객체들 메모리에서 해제하는과정.

Mark Sweep Compact 알고리즘

  1. old중 참조가 남아있는 객체 식별 (mark)
  2. mark안된 객체를 식별 (sweep)
  3. 필요없는 객체를 지우고 파편화된 메모리 모음 (compact)

JDK 버전 별 기본 GC

  • 1.7 : Parallel
  • 8 : Parallel
  • 9 ~ 12 : G1

종류

  • serial
  • parallel
  • parallel compacting(old)
  • CMS
  • G1

Serial GC

  • GC의 시초다
  • 요즘 개인 pc도 다 멀티프로세스라 이방식 잘 안씀
  • 아두이노나 라즈베리파이등등 이용해서, 펌웨어 개발? 할 때 single cpu 쓰면 사용할수도 있지만 java를 쓰는지는 의문

Parallel GC

  • serial gc 에서 cpu여러개 돌려 병렬로 계산한다는것에 차이

Parallel Compacting(Old) GC

  • Parallel GC 의 옛날 jdk1.6, jdk1.5 버전
  • Mark-Sweep-Compaction 알고리즘이아닌 Mark-Summary-Compaction 알고리즘 사용
  • Summary가 좀 더 복잡하고 오래된 알고리즘이라 함.
  • 결국 안씀…. 쓸수도있나..?

Concurrent Mark Sweep GC

  • CMS GC
  • 각 gc단계를 세분화해 Concurrent를 이용한 동시성제어를 함으로써 stop-the-world 시간을 늦추는데 목적이 있음

CMS GC 차이

순서는 아래와 같다

  1. Mark 단계 : 매우 짧은 대기 시간으로 살아 있는 객체를 찾는 단계
  2. Sweep 단계 : 서버 수행과 동시에 살아 있는 객체에 표시를 해 놓는 단계
  3. Remark 단계 : Concurrent 표시 단계에서 표시하는 동안 변경된 객체에 대해서 다시 표시하는 단계
  4. Concurrent Sweep 단계 : 표시되어 있는 쓰레기를 정리하는 단계

주의할 점은 CMS는 Compaction단계가 따로 없어서 old GC 진행하다보면 메모리 파편화가 일어나는데 심해지면 따로 Compaction 단계를 수행 할 수 있다.

Compaction단계 수행 시 Parallel 보다 stop-the-world가 더 길어지므로 주의

G1 GC

기존의 young region, old region이 정해져 있는 방식을 General GC라고 하는데 G1 GC는 General GC 의 방식이 아니다.

기존의 힙 메모리를 적당한 사이즈로 쪼게어 블록을 만들어 GC를 수행하며, 블록의 상태에 따라 Old, 또는 Young 메모리 블록으로변경 되기 때문에 힙 사이즈가 클 때 사용하면 좋다.

순서

  1. Evacuation Pause : Minor GC와 동일한 작업으로, Young 영역을 GC 한다. (STW 발생)
  2. Concurrent Cycle : Old 영역을 GC하기 위한 사전 단계로, live 객체를 Marking 한다.
  3. Mixed GC : Old 영역에 대한 GC를 마무리하는 단계로, Young 영역과 Old 영역을 동시에 GC한다.

G1GC

참조 https://www.oracle.com/technetwork/tutorials/tutorials-1876574.html