일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 취업리부트코스
- 프로그래머스
- jwttoken
- @FeignClient
- 항해99
- Spring multimodule
- 인프콘 2024
- 디자인패턴
- 파이썬
- 전략패턴 #StrategyPattern #디자인패턴
- 구글 OAuth login
- TiL
- 99클럽
- KPT회고
- 프로그래머스 이중우선순위큐
- DesignPattern
- 1주일회고
- 코딩테스트 준비
- Python
- jwt
- 개발자부트캠프추천
- 단기개발자코스
- 커스텀 헤더
- 빈 충돌
- 빈 조회 2개 이상
- 디자인 패턴
- spring batch 5.0
- infcon 2024
- JavaScript
- 개발자 취업
- Today
- Total
m1ndy5's coding blog
Garbage Collector 본문
Garbage Collector
가비지 컬렉터는 메모리 관리를 자동으로 처리하는 JVM의 구성 요소 중 하나이다.
가비지 컬렉터의 주된 역할은 Heap 영역에서 사용하지 않는 객체를 찾고 자동으로 메모리에서 해제하여 시스템 자원을 효율적으로 관리하는 것이다.
가비지 컬렉터의 역할
1. 가비지 식별 : 가비지 컬렉터는 더 이상 참조되지 않는 개체를 식별한다. 객체가 어떠한 참조에도 도달하지 않는 경우, 해당 객체는 가비지로 간주된다.
2. 가비지 수거 : 가비지 컬렉터는 식별된 가비지 객체들을 메모리에서 수거(삭제)한다. 이러한 프로세스를 통해 메모리 누수를 방지하고 프로그래머가 명시적으로 메모리를 관리하지 않아도 된다.
가바지 컬렉터의 원리
1. 참조 추적 : 대부분의 가비지 컬렉터는 참조 추적 알고리즘을 사용하여 객체 간의 참조 관계를 추적한다. 루트 객체(주로 전역 변수, 스택, 레지스터 등)에서 시작하여 참조되는 모든 객체를 추적하고, 도달할 수 없는 객체를 가비지로 표시한다.
2. 메모리 해제 : 가비지로 표시된 객체들은 메모리에서 해제된다. 이때, 자바의 가상 머신은 자동 메모리 관리를 위해 가비지 컬렉션을 주기적으로 실행하거나 프로그램이 일시 정지되는 동안 실행할 수 있다.
가비지 컬렉터 알고리즘
1. 표시-정리 알고리즘(Mark-Sweep) : 가장 기본적인 알고리즘으로 먼저 참조되는 모든 객체를 표시하고, 그 후에 표시되지 않은 객체들을 메모리에서 해제한다. 단점으로는 메모리 단편화가 발생할 수 있다.
-> 삭제된 객체의 메모리 공간이 연속적이지 않아서 크기가 큰 객체를 할당할 때 메모리 할당에 어려움이 있을 수 있지만 Compact 과정을 거쳐 메모리가 할당된 부분과 그렇지 않은 부분으로 압축한다.
2. 세대별 가비지 컬렉션(Generation Garbage Collection) : 객체의 수명을 세대로 나누어 관리하는 것, Young 영역과 Old 영역으로 나뉜다.
- Young 영역 : 새롭게 객체가 할당되는 영역, 대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에 대한 가비지 컬렉션을 Minor GC라고 부른다.
- Old 영역 : Young 영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역, Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다. 이 영역에 대한 가비지 컬렉션을 Major GC 또는 Full GC라고 부른다.
Old 영역이 Young 영역보다 크게 할당되는 이유는 Young 영역의 수명이 짧은 객체들은 큰 공간을 필요로 하지 않고, 큰 객체들은 Young 영역이 아니라 바로 Old 영역에 할당되기 때문이다.
전반적으로 Minor GC가 더 자주 발생하고 Major GC는 Old 영역의 메모리가 부족해질 때 일어나서 상대적으로 덜 자주 발생하지만 Major GC는 시스템의 전반적인 일시 중지를 발생시키므로 주의가 필요하다.
따라서 이러한 Stop the World 문제가 발생하는 것을 개선하기 위해 다양한 Garbage Collection 알고리즘이 개발 되었다.
- Concurrent Mark-Sweep (CMS):
- 원리: CMS 가비지 컬렉션은 메모리를 세대로 나누고, young generation은 병렬로 수행하면서 old generation은 병행적으로(non-blocking) 수행한다.
- 장점: 일시 중지 시간을 최소화하여 Stop-the-World 시간을 줄인다.
- 단점: 메모리 파편화이 발생할 수 있고, 처리량이 증가할 때 예측할 수 없는 일시 중지가 발생할 수 있다.
- Java 14에서 사용이 중지됐다.
- Garbage-First (G1) Garbage Collection:
- 원리: G1 가비지 컬렉션은 힙을 더 작은 영역(Regoin)으로 나누고, 이 영역들 간의 가비지 컬렉션을 병렬로 수행합니다. 가장 먼저 가비지 컬렉션을 해야 할 영역을 선정하는 방식으로 동작한다.
- 장점: Stop-the-World 시간을 예측 가능하게 줄이고, 힙을 더 세분화하여 효율적으로 가비지 컬렉션을 수행한다.
- 단점: 몇몇 특정 상황에서 처리량이 감소할 수 있다.
- Java 9+ 버전의 디폴트 GC이다.
- Shenandoah Garbage Collection:
- 원리: Shenandoah는 병렬 및 병행적인 방식을 통해 최소한의 일시 중지 시간으로 가비지 컬렉션을 수행한다. 또한, 힙 영역을 더 작은 단위로 나누어 처리한다.
- 장점: 일시 중지 시간을 매우 짧게 유지하면서도 전반적인 처리량을 유지할 수 있다.
- 단점: 일부 애플리케이션에 대한 최적화가 필요할 수 있으며, 모든 플랫폼에서 지원되지 않을 수 있다.
- Java 12에 릴리즈됐다.
- Z Garbage Collector(ZGC)
- 원리: ZPage라는 영역을 사용하며, G1의 Region은 크기가 고정인데 ZPage는 2mb 배수로 동적 운영한다.(큰 객체가 들어오면 2^로 영역을 구성해 처리)
- 장점: 힙 크기가 증가하더라도 'stop-the-world'의 시간이 10ms를 넘지 않는다.
- 단점: 일부 응용 프로그램에서는 ZGC가 다른 가비지 컬렉터보다 성능이 떨어질 수도 있고 메모리 사용량이 더 클 수 있지만 일반적으로는 성능 및 일시 중지 시간 측면에서 우수한 결과를 보이는 편이다.
- Java 15에 릴리즈됐다.
'CS Study' 카테고리의 다른 글
JPA의 동작원리 (1) | 2024.03.13 |
---|---|
Java의 메모리 영역 (0) | 2024.03.07 |
JVM, JRE, JDK & 자바 프로그램의 실행 과정 (0) | 2024.03.07 |
영속성 컨텍스트 (0) | 2024.03.06 |
JPA 도입 시 고려해 볼 사항 (0) | 2024.03.06 |