Open kgh2120 opened 9 months ago
...
Concurrent Mark-Sweep(CMS) GC\
CMS GC와 Parallel GC의 차이 = Compaction 작업 유무로 구분될 수 있다.
Compaction : 메모리의 조각화(fragmentation) 문제를 해결하기 위한 작업
메모리 조각화
가비지 컬렉션을 통해 불필요한 객체들이 해제되면서 메모리의 여러 위치에 여유 공간이 생기게 되는데, 이러한 여유 공간들이 연속되지 않고 여기저기 분산되어 있을 때 발생하는 현상
공간이 많아도, 분산으로 인해, 연속적인 공간이 부족하여 메모리 할당을 실패하는 문제가 발생할 수 있다.
Compaction은 이 조각화된 메모리를 정리하여 연속적인 블록으로 만들어주는 과정이다.
CMS GC는 주요 목적이 응답 시간을 최소하 하는 것이므로, Compaction 작업을 기본적으로 수행하지는 않는다.
G1 GC의 G1은 (Garbage-First) 의 약자로, 가장 많은 가비지가 있는 영역부터 수집하는 핵심 전략을 갖고 있다.
이렇게 하면 가장 효율적으로 메모리를 재활용할 수 있으며, 주어진 일시 중지 시간(pause time) 목표 내에서 가능한 한 최대의 메모리를 회수하는 것이 가능해진다.
G1은 Java 7에서 처음으로 사용 가능하게 되었는데, 당시에 더 오래 된 Parallel GC나 CMS GC 와 같은 GC들에 비해 완전히 검증되지 않았다.
초기 버전의 G1 GC는 일부 케이스에서 예상치 못한 행동이나 성능 문제를 일으킬 수 있었다.
어떤 케이스 였을까 ?
- G1 GC의 주요 목표 중 하나는 일시 중지 시간을 줄이는 것이지만, 초기 버전에서는 일부 상황에서 예상보다 긴 일시 중지 시간이 발생했다.
- G1은 메모리 조각화 문제를 해결하기 위해 설계되었지만, 초기 버전에서는 여전히 일부 상황에서 조각화 문제가 발생했다.
- 일부 애플리케이션에서는 G1 GC를 사용할 때 전반적인 성능 저하가 발생했으며, 이는 CMS GC나 Parallel GC와 비교했을 때 특히 두드러졌다.
이러한 문제점들은 시간이 지나면서 Java 업데이트와 함께 개선되었고, G1 GC는 현재 많은 환경에서 안정적으로 사용되고 있다.
G1이 기본 GC로 채택된 것에는 여러가지 중요 요인들이 있다.
예측 가능한 일시 중지 시간: \ G1 GC는 일시 중지 시간 목표 (예: -XX:MaxGCPauseMillis)를 설정할 수 있게 설계되었다. 이를 통해 개발자들은 일시 중지 시간을 예측 가능한 범위로 제한할 수 있다. 이러한 특징은 실시간성을 요구하는 애플리케이션에서 특히 중요하다.
대규모 힙 지원
CMS GC의 한계점: \ 메모리 조각화와 전체 GC로 인한 긴 일시 중지 시간 문제 등의 한계점을 해결하기 위해 G1 이 등장했다.
현대 애플리케이션의 요구 사항 : \ 대규모 메모리, 실시간 요구 사항 및 효율성을 중시하는 현대 애플리케이션의 요구 사항을 충족시키기 위해 G1 GC가 적합하다고 판단된다.
👍 문제
G1 GC
는 과정이 복잡한 만큼 성능이 제일 좋다고 합니다. 하지만 책의 집필 시점에서는 안정성 문제로 작가는 적용하지 않았다고 하는데요, 책이 작성된지 벌써 10년이 지난 만큼, 지금은G1 GC
에 대한 안정성 문제가 해결되었는지 궁금합니다. 그리고 여유가 된다면 어떤이유로 안정성 문제가 발생했는지에 대해서 알아봐주세요.✈️ 선정 배경
지금은 쓰겠지... 싶어서 올려봤습니다. 좋다는데 안쓰면 아쉽잖아요.
📺 관련 챕터 및 레퍼런스
story 17. 도대체 GC는 언제 발생할까?
🐳 비고