Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

G1 GC 지금은 어떤가? #17

Open
kgh2120 opened this issue Oct 8, 2023 · 1 comment
Open

G1 GC 지금은 어떤가? #17

kgh2120 opened this issue Oct 8, 2023 · 1 comment
Assignees
Labels
ch17 about chapter17 🥇 week4

Comments

@kgh2120
Copy link
Member

kgh2120 commented Oct 8, 2023

👍 문제

G1 GC는 과정이 복잡한 만큼 성능이 제일 좋다고 합니다. 하지만 책의 집필 시점에서는 안정성 문제로 작가는 적용하지 않았다고 하는데요, 책이 작성된지 벌써 10년이 지난 만큼, 지금은 G1 GC에 대한 안정성 문제가 해결되었는지 궁금합니다. 그리고 여유가 된다면 어떤이유로 안정성 문제가 발생했는지에 대해서 알아봐주세요.

✈️ 선정 배경

지금은 쓰겠지... 싶어서 올려봤습니다. 좋다는데 안쓰면 아쉽잖아요.

📺 관련 챕터 및 레퍼런스

story 17. 도대체 GC는 언제 발생할까?

🐳 비고

@kgh2120 kgh2120 added ch17 about chapter17 🥇 week4 labels Oct 8, 2023
@olrlobt
Copy link
Contributor

olrlobt commented Oct 13, 2023

G1 GC

  • CMS GC를 대체하기 위해 새롭게 등장한 GC
  • 대용량의 메모리가 있는 멀티 프로세서 시스템을 위해 제작됨.
  • CMS GC보다 효율적으로 동시에 Application과 GC를 진행할 수 있고, 메모리 Compaction 과정까지 지원한다.
  • Java 9 버전부터 기본 GC 방식



GC의 종류

  • Serial GC
  • Parallel GC
  • Parallel Old GC

...

  • Concurrent Mark-Sweep(CMS) GC\

    • 가비지 컬렉션 알고리즘 중 하나
    • 애플리케이션의 응답 시간을 최적화하려는 목적으로 설계됨
    • 주로 큰 힙 크기와 긴 가비지 컬렉션 일시 중지 시간을 피하고 싶은 애플리케이션에서 사용됨
  • CMS GC와 Parallel GC의 차이 = Compaction 작업 유무로 구분될 수 있다.

Compaction : 메모리의 조각화(fragmentation) 문제를 해결하기 위한 작업

메모리 조각화

가비지 컬렉션을 통해 불필요한 객체들이
해제되면서 메모리의 여러 위치에 여유 공간이 생기게 되는데, 이러한 여유 공간들이 연속되지 않고 여기저기 분산되어 있을 때 발생하는 현상

공간이 많아도, 분산으로 인해, 연속적인 공간이 부족하여
메모리 할당을 실패하는 문제가 발생할 수 있다.

Compaction은 이 조각화된 메모리를 정리하여 연속적인 블록으로 만들어주는 과정이다.

CMS GC는 주요 목적이 응답 시간을 최소하 하는 것이므로, Compaction 작업을 기본적으로 수행하지는 않는다.



왜 이름이 G1일까?

G1 GC의 G1은 (Garbage-First) 의 약자로, 가장 많은 가비지가 있는 영역부터 수집하는 핵심 전략을 갖고 있다.

이렇게 하면 가장 효율적으로 메모리를 재활용할 수 있으며, 주어진 일시 중지 시간(pause time) 목표 내에서 가능한 한 최대의 메모리를 회수하는 것이 가능해진다.



G1은 어떤 안정성 문제가 있었을까?

G1은 Java 7에서 처음으로 사용 가능하게 되었는데, 당시에 더 오래 된 Parallel GC나 CMS GC
와 같은 GC들에 비해 완전히 검증되지 않았다.

초기 버전의 G1 GC는 일부 케이스에서 예상치 못한 행동이나 성능 문제를 일으킬 수 있었다.

어떤 케이스 였을까 ?

  1. G1 GC의 주요 목표 중 하나는 일시 중지 시간을 줄이는 것이지만,
    초기 버전에서는 일부 상황에서 예상보다 긴 일시 중지 시간이 발생했다.
  2. G1은 메모리 조각화 문제를 해결하기 위해 설계되었지만,
    초기 버전에서는 여전히 일부 상황에서 조각화 문제가 발생했다.
  3. 일부 애플리케이션에서는 G1 GC를 사용할 때 전반적인 성능 저하가 발생했으며,
    이는 CMS GC나 Parallel GC와 비교했을 때 특히 두드러졌다.

이러한 문제점들은 시간이 지나면서 Java 업데이트와 함께 개선되었고,
G1 GC는 현재 많은 환경에서 안정적으로 사용되고 있다.



G1은 어떻게 기본 GC가 될 수 있었을까?

G1이 기본 GC로 채택된 것에는 여러가지 중요 요인들이 있다.

  1. 예측 가능한 일시 중지 시간:
    G1 GC는 일시 중지 시간 목표 (예: -XX:MaxGCPauseMillis)를 설정할 수 있게 설계되었다. 이를 통해 개발자들은 일시 중지 시간을 예측 가능한 범위로 제한할 수 있다. 이러한 특징은 실시간성을 요구하는 애플리케이션에서 특히 중요하다.

  2. 대규모 힙 지원

  3. CMS GC의 한계점:
    메모리 조각화와 전체 GC로 인한 긴 일시 중지 시간 문제 등의 한계점을 해결하기 위해 G1 이 등장했다.

  4. 현대 애플리케이션의 요구 사항 :
    대규모 메모리, 실시간 요구 사항 및 효율성을 중시하는 현대 애플리케이션의 요구 사항을 충족시키기 위해 G1 GC가 적합하다고 판단된다.



Ref. #

  1. https://steady-coding.tistory.com/590

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ch17 about chapter17 🥇 week4
Projects
None yet
Development

No branches or pull requests

2 participants