🧹Garbage Collection
- c/c++과 달리 자바는 개발자가 명시적으로 객체를 해제할 필요가 없다. 대신 사용하지 않는 객체를 JVM이 메모리에서 삭제하는 작업을 거치고 이 작업을 GC라고 한다
- JVM의 메모리는 class, stack, heap, native method, PC 총5가지 영역으로 나뉘는데 GC는 힙 메모리만 다루며
객체가 null인 경우, 블럭 실행 종료 후 블럭 안에서 생성된 객체, 부모 객체가 Null인 경우에 포함하는 자식 객체
와 같은 경우 GC의 대상이 된다
🧹GC 메모리 해제 - Mark & Compact
1. Marking
- 프로세스가 마킹을 호출하여 메모리가 참조되어 있는지 아닌지를 찾아낸다.
- 참조되는 객체는 파란색, 참조되지 않는 객체는 주황색으로 보여진다고 할 때, 모든 오브젝트는 마킹 단계에서 결정을 위해 스캔이 됨 -> 매우 많은 시간 소요
2. Normal Deletion
- 참조되지 않는 객체를 제거하고 메모리를 반환함
- 메모리 Allocator는 반환되어 비어진 블럭의 참조 위치를 저장해 두었다가, 새로운 오브젝트가 선언되면 할당되도록 한다.
3. Compacting
- 퍼포먼스를 향상시키기 위해, 참조되지 않는 객체를 제거하고 남은 참조되어지는 객체들을 묶음
문제점
위 방식대로 Marking-Sweeping-Compacting 순서로 진행하면 접근이 가능한 혹은 불가능한 메모리를 완벽하게 분류해서 해제하는 것이 가능하지만 실행 도중 메모리가 변경되면 마킹을 다시 해야하기 때문에 프로그램을 통째로 정지 (stop-the-world)시켜야 함 -> 오버헤드 발생
🧹Generational Garbage Collection
Weak Generational Hypothesis
- 신규로 생성한 객체의 대부분은 금방 사용하지 않는 상태가 되고, 오래된 객체에서 신규 객체로의 참조는 매우 적게 존재한다는 가설
- 이 가설에 기반하여 Young영역과 Old 영역으로 메모리를 분할한다. 그리고 신규로 생성되는 객체는 Young 영역에, 오랫동안 살아남은 객체는 Old 영역에 보관한다.
1. Young Generation
- 새로 생성한 객체 대부분이 위치하는 곳
- 대부분의 객체가 금방 접근 불가능한 상태가 되기 때문에 Young 영역에 생성되었다가 사라짐
- 이 영역에서 객체가 사라질 때 Minor GC가 발생한다고 함
2. Old Generation
- Young 영역에서 오래 살아남은 객체가 복사되는 곳
(오래 되었다는 것의 기준은 Young Generation 영역에서 Minor GC가 발생하는 동안 얼마나 오래 살아남았는지로 판단한다. 각 객체는 Minor GC에서 살아남은 횟수를 기록하는 age bit를 가지고 있으며, Minor GC가 발생할 때마다 age bit 값은 1씩 증가하게 되며 age bit 값이 MaxTenuringThreshold라는 설정 값을 초과하게 되는 경우 이동)
- 대부분 Young 영역보다 크게 할당되며, Young 영역보다 GC는 적게 발생
- 이 영역에서 객체가 사라질 때 Major GC 혹은 Full GC가 발생한다고 함
3. Permanent Area
- Method Area라고도 함
- JVM이 클래스들과 메소드들을 설명하기 위해 필요한 메타 데이터를 포함
Generational Garbage Collection 과정
1. 새로운 객체가 들어오면 Eden Space에 할당
2. Eden 객체가 가득차면 Minor GC 시작
3. 참조되는 객체들은 첫 번째 S0 survivor로 이동, 비 참조 객체는 Eden Space가 clear될 때 반환
4. 다음 Minor GC 반복
참조되는 객체는 두 번째 S1 Survivor로 이동되고, 최근 minor GC에서 첫 번 째 S0 Survivor로 이동된 객체들도 age가 증가하고 S1공간으로 이주한다
한 번 모든 survivor 객체들이 S1으로 이동하게 되면 S0과 Eden 공간은 clear
다음 Minor GC때 s0, s1 공간이 switch되는데 이 때 참조되는객체들은 s0으로 이동하며 aged된다. 그리고 s1과 Eden 은 clear
즉 아래와 같이 Survivor 영역은 두 개의 영역으로 구성되어 있고 Minor GC가 발생할 때마다 각 영역으로 switch되는데 이 과정에서 더 이상 참조되지 않는 객체는 메모리에서 제거됨 -> 이때 최종적으로 살아남은 객체가 Old Generation영역으로 옮겨짐
Minor GC 후 aged 오브젝트들이 일정한 age threshold를 넘게 되면 young generation에서 old로 promotion
Reference
https://gyoogle.dev/blog/computer-language/Java/Garbage%20Collection.html
https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html
https://siahn95.tistory.com/entry/Garbage-Collection-3-GC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Tracing-Garbage-Collection%EC%B6%94%EC%A0%81-%EA%B8%B0%EB%B0%98-Mark-Sweep-Mark-Sweep-Compact-Tri-color-Marking