대부분의 객체는 금방 접근 불가능(unreachable)한 상태가 된다.
Most of the objects become unused quickly
오래된 객체에서 젊은 객체로의 참조는 아주 적게 발생한다.
The ones that do not usually survive for a (very) long time
Internal Fragmentation
- 메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비 되는 상황
External Fragmentation
- 메모리가 할당되고 해제되는 작업이 반복될 때 작은 메모리가 중간중간 존재하게 된다.
- 이 때 중간중간에 생긴 사용하지 않는 메모리가 많이 존재해서 총 메모리 공간은 충분하지만 실제로 할당할 수 없는 상황
Minor GC
라고 한다.Major GC
라고 한다.Young Generation 영역에서 오래동안 살아남은 객체는 Old Generation 영역으로 옮겨지는데, 오래되었다고 판단되는 기준이 되는 값을 age라고 부른다.
각 객체는 Minor GC에서 살아남은 횟수를 기록하는 age bit 를 가지고 있으며, Minor GC가 발생할 때마다 age bit 값은 1씩 증가 하게되며, age bit 값이 MaxTenuringThreshold 라는 설정값을 초과하게 되는 경우 Old Generation 영역을 객체가 이동된다.
또는 Age bit가 MaxTenuringThreshold 초과하기 전이라도 Survivor 영역의 메모리가 부족할 경우에는 미리 Old Generation 으로 객체가 옮겨질 수도 있다.
이 Minor GC과정에서 살아남은 객체들에게 age값을 증가시켜주는 단계를 aging이라고 한다.
Serial GC
- 하나의 스레드로 Young 영역과 Old 영역을 연속적으로 처리하는 방식이다.
Parallel GC
- Serial GC와 달리 Young 영역에서의 콜렉션을 병렬(Parallel)로 처리합니다.
Parallel Compacting GC
- Parallel GC와 비교하여 Old 영역에 mark-summary-compact 알고리즘을 사용한다.
- Old 영역으로 이동된 객체들 중 살아있는 객체를 식별한다.(Mark)
- 전에 GC를 수행하여 Compaction 된 영역에 살아 있는 격체의 위치를 조사한다.(Summary)
- Compaction 수행 이후에는 Compaction 영역과 비어있는 영역으로 나눈다.(Compact)
Concurrent Mark Sweep(CMS) GC
- 애플리케이션 스레드와 GC 스레드를 동시에 수행하여 stop-the-world 시간을 최소화하는데 목적이 있다.
G1(Garbage First) GC
- Java 7에 정식으로 등장하여 Java 9부터 default가 된 GC 방법이다.
Z Garbage Collectors (ZGC)
- JDK11에 early access로 포함되어 15에 Production Ready 상태인 gc 방법이다.
Shenandoah GC
참조
- [블로그] GC(Garbage Collector)
- [블로그] Java 의 GC는 어떻게 동작하나?