공통 질문
1. JAR, WAR
2. JDK > JRE > JVM
3. GC
c언어에서는 메모리를 해제하는 명령어가 있다. 그러나 java에서는 이를 자동으로 해준다
Garbage Collection(GC)
- 프로그램이 동적으로 할당했던 메모리 영역(Heap) 중 필요 없게 된 영역을 자동 해제
- Java와 같은 언어에서 메모리 관리를 자동으로 처리 기법
- 애플리케이션의 메모리에서 사용하지 않는 객체를 자동으로 찾아서 메모리를 회수
GC 동작 방법
- 객체 생성
- Java 애플리케이션에서 객체가 생성되면 JVM의 Heap 메모리에 할당
- 객체 참조
- 객체가 참조되면, GC는 이 객체를 "활성"으로 간주
- 사용되지 않는 객체 식별
- 애플리케이션 코드에서 객체에 대한 참조가 없어지면, GC는 이 객체를 "사용되지 않는 객체"로 간주하고 Heap 메모리에서 제거
- 메모리 회수
- GC는 사용되지 않는 객체를 찾아서 Heap 메모리에서 제거하고, 그 Heap 메모리 공간을 다시 사용
GC 발생 시점
- 자동 발생
- GC는 JVM이 자동으로 메모리 부족을 감지하거나 일정 주기로 발생시킴
- 메모리 부족
- Heap 메모리가 가득 차면 GC가 발생하여 Heap 메모리를 회수
- 특정 메서드 호출
- 애플리케이션 코드에서 직접 System.gc()를 호출하면 GC를 유도할 수 있지만, 이는 권장되지 않습니다.
JVM에서 GC
GC 방식의 발전
- Java 6: 기본 GC는 Serial GC, Parallel GC, CMS GC 등이 지원
- Java 7: G1GC가 도입되어, 보다 세밀한 메모리 관리와 정지 시간 예측을 지원
- Java 11: ZGC가 도입되어, 낮은 정지 시간을 제공하며 대규모 힙을 지원
- Java 12: Shenandoah GC가 도입되어, 낮은 정지 시간을 지원
1. 기본 GC 알고리즘
- Mark and Sweep
- 초기 JVM에서는 Mark and Sweep 방식이 기본으로 사용되었습니다.
- 이 방식은 사용 중인 객체를 마킹하고, 사용되지 않는 객체를 스윕(제거)하는 과정으로 구성됩니다.
- 간단하지만, 종종 긴 정지 시간을 유발할 수 있습니다.
- Mark Phase: 모든 활성 객체를 마킹합니다.
- Sweep Phase: 마킹되지 않은 객체를 메모리에서 제거합니다.
- Mark and Compact: Mark and Sweep의 변형으로, 스윕 후에 메모리를 컴팩트하여 메모리 단편화를 줄입니다.
![]() |
![]() |
![]() |
2. Generational Garbage Collection
- Young Generation and Old Generation
- Generational Garbage Collection은 객체의 수명에 따라 메모리를 젊은 세대와 오래된 세대로 나누어 관리합니다.
- 새로 생성된 객체는 젊은 세대에서 관리되고, 오래된 객체는 오래된 세대에서 관리됩니다.
- 이 방식은 대부분의 GC 알고리즘에서 사용됩니다.
- Young Generation: 짧은 생애를 가진 객체들을 위한 메모리 공간. Minor GC가 여기에 대해 발생합니다.
- Old Generation: 더 오래 살아남은 객체들을 위한 메모리 공간. Major GC 또는 Full GC가 여기에 대해 발생합니다.
3. 주요 GC 알고리즘
- Serial GC
- 단일 스레드로 GC를 수행하는 간단한 방식입니다.
- 작은 애플리케이션이나 단일 CPU 환경에서 유용합니다.
- Parallel GC
- 여러 스레드를 사용하여 GC를 병렬로 수행합니다.
- 멀티코어 시스템에서 성능을 향상시킵니다.
- Concurrent Mark-Sweep (CMS) GC:
- Mark and Sweep을 확장하여 GC의 일부 작업을 애플리케이션 스레드와 동시에 수행합니다.
- GC의 정지 시간을 줄이는 것을 목표로 합니다.
- Initial Mark Phase: 빠르게 초기 마킹을 수행합니다.
- Concurrent Mark Phase: 애플리케이션과 동시에 객체를 마킹합니다.
- Remark Phase: 최종 마킹을 수행합니다.
- Concurrent Sweep Phase: 객체를 제거합니다.
- G1 Garbage Collector (G1GC)
- Java 7에 도입된 현대적인 GC 알고리즘입니다.
- 힙 메모리를 여러 개의 리전으로 나누어 관리하고, 성능과 정지 시간을 예측할 수 있습니다.
- Young Generation and Old Generation: 각각의 리전에서 젊은 세대와 오래된 세대 객체를 관리합니다.
- Mixed GC: 젊은 세대와 일부 오래된 세대를 동시에 수집합니다.
- ZGC (Z Garbage Collector)
- Java 11에서 도입된 GC 알고리즘으로, 매우 낮은 정지 시간과 대규모 힙을 지원합니다.
- Region-based 구조와 비슷한 방식으로 동작하지만, 보다 낮은 정지 시간을 목표로 합니다.
- Shenandoah GC
- Java 12에서 도입된 GC로, ZGC와 유사한 목표를 가지고 있지만 다른 방식으로 구현되었습니다.
- 정지 시간을 최소화하고, 대규모 힙을 지원합니다.
GC 알고리즘의 발전 이유
- 성능 향상: 현대의 GC 알고리즘은 정지 시간을 줄이고, 멀티코어 CPU 환경에서의 성능을 극대화하기 위해 개발되었습니다.
- 예측 가능성: G1GC와 ZGC, Shenandoah GC는 예측 가능한 정지 시간을 제공하여 애플리케이션의 응답성을 개선합니다.
- 대규모 힙 지원: ZGC와 Shenandoah GC는 대규모 힙을 효과적으로 지원하여 메모리 사용을 최적화합니다.
GC 튜닝과 G1GC
- G1GC의 설계: G1GC는 메모리를 여러 리전으로 나누어 관리하며, 자동으로 메모리를 정리할 수 있도록 설계되었습니다. 리전 기반의 메모리 관리와 동시성 GC 작업으로 인해, GC 튜닝의 필요성이 줄어들었습니다.
- 리전 기반 관리: 메모리를 리전으로 나누어 관리함으로써, G1GC는 정지 시간의 예측과 조정이 용이하며, 전체 힙의 동시 GC를 줄일 수 있습니다. 이는 GC 튜닝의 복잡성을 감소시키고, 시스템 성능을 안정화하는 데 기여합니다.
요약
- JVM에서의 GC 방식:
- JVM은 다양한 GC 알고리즘을 제공하며, Java 버전별로 발전해왔습니다.
- 초기에는 Mark and Sweep 방식이 기본이었으나,
- 현재는 G1GC, ZGC, Shenandoah GC와 같은 고급 알고리즘이 사용됩니다.
- GC 튜닝의 목표
- 성능 최적화, 정지 시간 최소화, 메모리 사용 효율성 증대.
- G1GC의 이점
- 리전 기반 관리로 GC 성능과 예측 가능성을 향상시키며, 튜닝의 필요성을 줄입니다.
G1 Garbage Collector (G1GC)
G1GC의 특징
- 리전(Region) 기반 관리
- G1GC는 Heap 메모리를 여러 개의 리전(Region)으로 나누어 관리합니다.
- 각 리전은 서로 다른 크기와 용도로 사용될 수 있으며, 이로 인해 메모리의 효율적인 관리와 회수 가능
- 동시성
- G1GC는 애플리케이션의 정지 시간을 줄이기 위해 여러 스레드를 사용하여 GC를 수행
- 예측 가능성
- G1GC는 정지 시간 목표를 설정할 수 있어, 정지 시간 예측 용이
G1GC의 GC 튜닝 수고를 덜어주는 이유
- 리전 기반 관리
- 메모리를 리전으로 나누어 관리함으로써, G1GC는 메모리 회수 작업을 더 세밀하게 조정할 수 있습니다. 이를 통해 전체 힙 메모리의 동시 GC를 줄이고, 필요한 리전만을 대상으로 GC를 수행합니다.
- 동적 조정
- G1GC는 GC의 성능과 정지 시간을 동적으로 조정할 수 있습니다. 이는 시스템의 상태와 요구에 따라 GC의 동작을 최적화합니다.
- 예측 가능한 정지 시간
- G1GC는 정지 시간 목표를 설정하여 애플리케이션의 응답성을 일정 수준으로 유지할 수 있습니다.
- 이는 GC 튜닝의 복잡성을 줄이고, 예측 가능한 성능을 제공합니다.
![]() |
![]() |
![]() |
|
![]() |
![]() |
![]() |
![]() |
![]() |
|
![]() |
|
GC 튜닝의 궁극적인 목표
- 성능 최적화: GC 튜닝의 주요 목표는 애플리케이션의 성능을 향상시키는 것입니다. GC가 너무 자주 발생하면 애플리케이션의 성능이 저하될 수 있습니다.
- GC 지연 최소화: GC는 애플리케이션의 실행을 중단할 수 있습니다. 이를 최소화하여 애플리케이션의 응답성을 유지하는 것이 목표입니다.
- 메모리 사용 효율성: 메모리 회수를 효율적으로 수행하여 메모리 부족 문제를 방지합니다.
- 개발자가 메모리에 대해 신경을 덜 쓸 수 있어서 편해지는데, 그에 따른 단점은 없을까요?
- 개발자가 GC 튜닝을 하는 궁극적인 목표는 무엇일까요?
- G1GC부터는 GC튜닝에 크게 손이 가진 않는데, G1GC는 어떻게 만들었길래 개발자가 튜닝을 이전보다 덜 해도 되는걸까요?
- 리전으로 구성된 구조가 왜 튜닝의 수고를 덜어주는걸까요?
이미지 출처
https://www.youtube.com/watch?v=FMUpVA0Vvjw&t=42s
https://www.youtube.com/watch?v=8JrciOSL3Gk
https://www.youtube.com/watch?v=jXF4qbZQnBc
'학습 기록 (Learning Logs) > CS Study' 카테고리의 다른 글
운영체제 (0) | 2024.12.02 |
---|---|
네트워크 (0) | 2024.11.24 |
8월 4주차 JDK, JRE, JVM (0) | 2024.08.19 |
8월 4주차 jar, war (0) | 2024.08.19 |
8월 3주차 (0) | 2024.08.12 |