GC
- java에서 버려진 객체들 메모리에서 해제하는과정.
Mark Sweep Compact 알고리즘
- old중 참조가 남아있는 객체 식별 (mark)
- mark안된 객체를 식별 (sweep)
- 필요없는 객체를 지우고 파편화된 메모리 모음 (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 시간을 늦추는데 목적이 있음

순서는 아래와 같다
- Mark 단계 : 매우 짧은 대기 시간으로 살아 있는 객체를 찾는 단계
- Sweep 단계 : 서버 수행과 동시에 살아 있는 객체에 표시를 해 놓는 단계
- Remark 단계 : Concurrent 표시 단계에서 표시하는 동안 변경된 객체에 대해서 다시 표시하는 단계
- 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 메모리 블록으로변경 되기 때문에 힙 사이즈가 클 때 사용하면 좋다.
순서
- Evacuation Pause : Minor GC와 동일한 작업으로, Young 영역을 GC 한다. (STW 발생)
- Concurrent Cycle : Old 영역을 GC하기 위한 사전 단계로, live 객체를 Marking 한다.
- Mixed GC : Old 영역에 대한 GC를 마무리하는 단계로, Young 영역과 Old 영역을 동시에 GC한다.

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