Goal
- gc에 대해 알아본다
- gc프로세스에 대해 알아본다
- gc의 종류에 대해 알아본다
Garbage Collector
가비지 컬렉터(GC)는 힙 메모리를 살펴보고, 사용 중인 객체를 식별하고 사용하지 않는 객체를 삭제하는 프로세스이다.
즉, 애플리케이션의 동적 메모리 할당 요청을 자동으로 관리한다.
Java에서는 Java Virtual Machine (JVM)에서 자체적으로 Garbage collector를 제공하고 있으며, 다양한 Garbage collector가 존재하여 프로그램의 크기, 특성, 요구사항 등에 맞는 적절한 Garbage collector를 선택하여 사용할 수 있다.
실행 과정
1 단계 : 마킹
사용 중인 메모리와 그렇지 않은 메모리를 식별한다.
- 참조된 개체는 파란색으로 표시되고, 참조되지 않은 개체는 금색으로 표시된다.
- 이 결정을 내리기 위해 마킹 단계에서 모든 물체를 스캔한다. 시스템의 모든 개체를 검색해야 하는 경우 시간이 많이 걸리는 프로세스가 될 수 있다.
2 단계 : 일반 삭제
일반 삭제는 참조된 개체와 여유 공간에 대한 포인터를 남기고 참조되지 않은 개체를 제거한다.
- memory allocator는 새 개체를 할당할 수 있는 여유 공간 블록에 대한 참조를 보유
3 단계 : 압축을 통한 삭제
성능을 더욱 향상시키기 위해 참조되지 않은 개체를 삭제하는 것 외에도 나머지 참조된 개체를 압축할 수도 있다. 참조된 개체를 함께 이동하면 새 메모리 할당이 훨씬 쉽고 빨라진다.
세대별 garbage collection이 필요한 이유
JVM에서 모든 객체를 표시하고 압축하는 것은 비효율적이다. 더 많은 객체가 할당될수록 객체 목록이 커져서, GC시간이 점점 더 오래 걸리기 때문이다.
세대별 garbage collection 프로세스
1 단계 : 먼저 모든 새 개체가 eden 공간에 할당되고, S0, S1은 비어있음
2 단계 : eden 공간이 가득 차면 minor GC의 트리거가 됨
3 단계 : 참조된 개체는 S0로 이동. 참조되지 않은 개체는 eden 공간이 지워지면 삭제
4 단계 : 다음 Minor GC에서 동일한 일이 eden 공간에서 발생. 참조되지 않은 개체는 삭제되고 참조된 개체는 생존 공간으로 이동.
그러나 이 경우 두 번째 서바이벌 공간(S1)으로 이동. 또한 첫 번째 서바이벌 공간(S0)에 있는 마지막 Minor GC의 객체는 나이가 증가하고 S1으로 이동. 살아남은 모든 개체가 S1으로 이동되면 S0과 eden이 모두 삭제.
5 단계 : 다음 Minor GC에서도 같은 과정이 반복. 그러나 이번에는 Survival 공간이 전환된다. 참조된 객체는 S0으로 이동된다. Eden과 S1이 지워진다.
6 단계 : Minor GC 후 오래된 개체가 특정 연령 임계값(이 예에서는 8)에 도달하면 young generation 에서 old genration으로 이동한다.
7 단계 : Minor GC가 계속 발생함에 따라 개체는 계속해서 old genration으로 이동
8 단계 : 대부분의 경우 young generation에서 전체 프로세스가 처리되지만, old genration에서 Major GC가 수행되어 해당 공간을 정리하고 압축한다.
Garabage Collector의 종류
- Serial GC
- Serial Collector는 단일 스레드를 사용하여 모든 가비지 수집 작업을 수행하므로 스레드 간에 통신 오버헤드가 없기 때문에 상대적으로 효율적.
- 단일 프로세서 시스템에 가장 적합
- -XX:+UseSerialGC.
- 애플리케이션에 작은 데이터 세트(최대 약 100MB)가 있는 경우 추천
- 응용 프로그램이 단일 프로세서에서 실행되고 stop the world 요구 사항이 없는 경우
- Parallel GC
- Serial GC를 병렬화 한 것
- 다중 프로세서 또는 다중 스레드 하드웨어에서 실행되는 중대형 데이터 세트가 포함된 응용 프로그램을 위한 것
- -XX:+UseParallelGC.
- 병렬 압축 옵션 비활성화 -XX:-UseParallelOldGC .
- (a) 최고 애플리케이션 성능이 첫 번째 우선 순위이고 (b) stop the world 요구 사항이 없거나 1초 이상의 일시 중지가 허용되는 경우
- Concurrent Mark Sweep (CMS)
- 더 짧은 stop the world를 선호하고 가비지 수집과 프로세서 리소스를 공유할 수 있는 애플리케이션을 위한 것
- -XX:+UseConcMarkSweepGC
- 응답 시간이 전체 처리량보다 더 중요하고 가비지 수집 일시 중지를 약 1초 미만으로 유지해야 하는 경우
- Garbage-First (G1)
- 대용량 메모리가 있는 다중 프로세서 시스템용. 높은 처리량을 달성하면서 높은 확률로 stop the world 시간 목표를 충족
- Java 7에서 사용할 수 있으며 CMS 수집기를 장기적으로 대체하도록 설계
- -XX:+UseG1GC.
- 응답 시간이 전체 처리량보다 더 중요하고 stop the world 를 약 1초 미만으로 유지해야 하는 경우
- Z GC
- 확장 가능한 짧은 지연 시간의 GC. ZGC는 애플리케이션 스레드 실행을 중단하지 않고 비용이 많이 드는 모든 작업을 동시에 수행.
- ZGC는 낮은 대기 시간(10ms 미만 일시 중지)이 필요하거나 매우 큰 힙(멀티 테라바이트)을 사용하는 애플리케이션을 위한 것
- -XX:+UseZGC.
- JDK 11부터 사용 가능
- 응답 시간이 높은 우선 순위이거나 매우 큰 힙을 사용하는 경우
Parallel GC Heap structure
- 초기 메모리 구성
- JVM은 힙 메모리를 초기 구성. 이 구성에는 Young 영역, Old 영역, Perm 영역이 포함.
- 객체 생성
- JVM은 객체 생성 요청이 있으면 Young 영역에 객체를 생성.
- Young GC
- Young 영역이 꽉 차면, Minor GC(Young GC)가 실행. 이 과정에서 살아남은 객체는 다른 영역으로 이동.
- Old GC
- Old 영역이 꽉 차면, Full GC(Old GC)가 실행. 이 과정에서 살아남은 객체는 다른 영역으로 이동.
- Sweep
- Full GC 이후에는 객체를 메모리에서 제거하는 과정이 진행.
G1GC Heap structure
- 빨간색은 Eden, 빨간색 S는 Survivor, 파란색은 old gen, 파란색 H (Humongous Object) 처럼 사용됨
- 초기 메모리 구성
- JVM은 힙 메모리를 초기 구성. 이 구성에는 Young 영역, Old 영역, Humongous 영역, G1의 힙 분할 테이블 등이 포함
- 초기 마크 패이징
- G1은 Young 영역과 Old 영역을 여러 개의 블록으로 분할. 이 블록들에 대한 초기 마크 패이징이 수행됨.
- Young GC:
- Young 영역이 꽉 차면, Minor GC(Young GC)가 실행. 이 과정에서 살아남은 객체는 다른 영역으로 이동.
- Concurrent Marking:
- G1은 Young GC가 실행되는 동안 Old 영역의 살아남은 객체들을 동시에 마크
- Mixed GC:
- Old 영역의 블록 중에서 가득 찬 블록을 타겟으로 Mixed GC가 실행됨. 이 과정에서 살아남은 객체는 다른 영역으로 이동.
- Cleanup:
- G1은 사용하지 않는 객체들을 정리하고, 힙 분할 테이블을 업데이트
- G1GC는 영역이 작은 Young 영역과 큰 Old 영역을 사용하지 않고, 여러 개의 블록으로 나누어 처리하는 것이 특징
- 이를 통해 일괄적으로 GC를 실행하는 전통적인 GC보다 더 나은 메모리 사용량과 성능
- Mixed GC를 통해 Old 영역에서 사용하지 않는 블록을 빠르게 정리할 수 있어서 일시적으로 GC 시간이 늘어나더라도 애플리케이션 성능 하락을 줄일 수 있다.
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/
https://johngrib.github.io/wiki/java/gc/g1gc/#g1gc
https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
https://llnote.tistory.com/709
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html
'JAVA > about java' 카테고리의 다른 글
[Collection] List (0) | 2023.04.30 |
---|---|
[Generic] 제네릭 (0) | 2023.04.30 |
[Thread safe] Thread safe / unsafe 기준과 코드 설계 방법 (0) | 2023.04.25 |
[JVM] jvm / java.lang (1) | 2023.04.25 |
[Annotation] 어노테이션 (1) | 2023.04.25 |