-
Garbage CollectionJava 2023. 11. 9. 22:44
# Garbage Collection(GC) 란?
- JVM의 Runtime Data Area에는 Heap 영역이라는 곳이 있는데, 이 영역 내부에 참조되고 있지 않는(사용되고 있지 않는) 객체를 삭제해주는 것을 GC라고 한다.
# GC를 왜 할까?
- 메모리의 자원은 한정돼 있는데, 사용하지 않는 데이터가 자리를 차지하고 있으면 당연히 비효율적이기 때문에.
- C와 C++은 개발자가 수동으로 메모리 할당과 해제를 일일이 해줘야한다. 하지만 Java는 JVM의 GC가 일괄적으로 관리해주기 때문에 개발자는 비즈니스 로직 구현에만 집중할 수 있다.
# GC의 단점
- 메모리가 언제 해제되는지 정확하게 알 수 없어 제어하기 힘들다.
- 가비지 컬렉션(GC)이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생되는 문제점이 있다.
- Stop The World Event 라고 부른다.
# GC의 대상
객체에 레퍼런스가 있다면 Reachable로 구분되고, 객체에 유효한 레퍼런스가 없다면 Unreachable로 구분해버리고 수거해버린다.
- Reachable : 객체가 참조되고 있는 상태
- Unreachable : 객체가 참조되고 있지 않은 상태 (GC의 대상이 됨)
# GC 대상으로 만드는 방법
Student student = new Student(); student = null;
- 객체참조 변수 값에 null을 입력하는 방법
Student studentOne = new Student(); Student studentTwo = new Student(); studentOne = studentTwo;
- 첫번째 줄의 new Student(); 로 생성된 객체는 GC의 대상이 될 것이다.
register(new Student());
- 실무에서도 내가 자주 쓰는 방법인데, 변수 자체를 선언하지 않고 new 연산자로 객체만 생성하는 경우
- (위 처럼 new 연산자로 객체만 생성하는 경우를 anonymous object 라고 부른다.)
- GC에서 Mark And Sweep 이란 알고리즘을 통해 사용하지 않는 객체를 제거해준다.
- Mark 과정 : 먼저 Root Space로부터 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다.
- Sweep 과정 : 참조하고 있지 않은 객체 즉 Unreachable 객체들을 Heap에서 제거한다.
- Compact 과정 : Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축한다. (가비지 컬렉터 종류에 따라 하지 않는 경우도 있음)
# GC의 종류
1. Serial GC
- 서버의 CPU 코어가 1개일 때 사용하기 위해 개발된 가장 단순한 GC
- GC를 처리하는 쓰레드가 1개 (싱글 쓰레드) 이어서 가장 stop-the-world 시간이 길다.
- Minor GC 에는 Mark-Sweep을 사용하고, Major GC에는 Mark-Sweep-Compact를 사용한다.
- 보통 실무에서 사용하는 경우는 없다 (디바이스 성능이 안좋아서 CPU 코어가 1개인 경우에만 사용)
2. Parallel GC
- Java 5~8의 디폴트 GC
- Serial GC와 기본적인 알고리즘은 같지만, Young 영역의 Minor GC를 멀티 쓰레드로 수행
- Old 영역은 여전히 싱글 쓰레드이며 Serial GC에 비해 stop-the-world 시간 감소
3. Parallel Old GC
- Young 영역 뿐만 아니라, Old 영역에서도 멀티 쓰레드로 GC 수행
4. CMS GC (Concurrent Mark Sweep)
- 어플리케이션의 쓰레드와 GC 쓰레드가 동시에 실행되어 stop-the-world 시간을 최대한 줄이기 위해 고안된 GC
- 단, GC 과정이 매우 복잡해짐.
- GC 대상을 파악하는 과정이 복잡한 여러단계로 수행되기 때문에 다른 GC 대비 CPU 사용량이 높다
- 메모리 파편화 문제
5. G1 GC (Garbage First)
- CMS GC를 대체하기 위해 jdk 7 버전에서 최초로 release된 GC
- Java 9+ 버전의 디폴트 GC로 지정 4GB 이상의 힙 메모리, Stop the World 시간이 0.5초 정도 필요한 상황에 사용
- (Heap이 너무작을경우 미사용 권장)
- 기존의 GC 알고리즘에서는 Heap 영역을 물리적으로 고정된 Young / Old 영역으로 나누어 사용하였지만
- G1 gc는 아예 이러한 개념을 뒤엎는 Region이라는 개념을 새로 도입하여 사용.전체 Heap 영역을 Region이라는 영역으로 체스같이 분할하여 상황에 따라 Eden, Survivor, Old 등 역할을 고정이 아닌 동적으로 부여 Garbage로 가득찬 영역을 빠르게 회수하여 빈 공간을 확보하므로, 결국 GC 빈도가 줄어드는 효과를 얻게 되는 원리
6. Z Garbage Collector
- Java 15에 release
- 대량의 메모리(8MB ~ 16TB)를 low-latency로 잘 처리하기 위해 디자인 된 GC
- G1의 Region 처럼, ZGC는 ZPage라는 영역을 사용하며, G1의 Region은 크기가 고정인데 비해, ZPage는 2mb 배수로 동적으로 운영됨. (큰 객체가 들어오면 2^ 로 영역을 구성해서 처리)
- ZGC가 내세우는 최대 장점 중 하나는 힙 크기가 증가하더도 'stop-the-world'의 시간이 절대 10ms를 넘지 않는다는 것
'Java' 카테고리의 다른 글
메소드 레퍼런스(Method Reference) (0) 2024.04.27 Enum 활용방안 (0) 2023.12.01 자바의 Reflection 활용하기 (0) 2023.11.08 String Constant Pool 이란? (0) 2023.11.08 멀티프로세스와 멀티스레드 (0) 2023.10.31