728x90
GC (Garbage Collection)
가비지 콜렉션은 자바가 메모리를 관리하는 기법이다.
애플리케이션에서 동적으로 할당했던 메모리 (Heap 메모리) 중 사용하지 않는 영역을 정리하는 역할을 한다.
JVM 에서 GC 의 스케쥴링을 담당한다.
GC 가설 (weak generational hypothesis)
"대부분 객체는 빨리 수명을 다한다."
- 따라서 젊은 세대, 늙은 세대를 나누어 객체의 수명을 관리를 한다.
- 젊은 세대 중 미사용 객체는 힙 영역에서 삭제
- 늙은 세대 중 미사용 객체는 모았다가 한꺼번에 삭제
GC 알고리즘
Garbage 대상을 식별하고, 힙 메모리에서 제거한다.
1) Reference Counting Algorithm
- 각 객체마다 참조 개수 (reference count) 를 관리하여, 개수가 0이 되면 GC 수행
- 순환 참조 구조에서 참조 개수가 0 이 되지 않는 문제가 발생.
2) Mark-and-Sweep Algorithm
- RSet (Root Set) 에서 참조를 추적
- Mark 단계 : Garbage 대상이 아닌 객체를 마킹
- Sweep 단계 : 마킹되지 않은 객체를 삭제
- 마킹 정보를 초기화
- GC 가 동작하고 있을 경우, Mark 작업과 애플리케이션 작업의 충돌을 방지하기 위해 Heap 사용을 제한한다.
- 객체 삭제시, 메모리 공간이 파편화(fragmentation)되어 빈 현상이 발생. 즉 압축 (compaction) 작업이 없어서 OutOfMemory 발생할 수 있음
3) Mark-and-Compact Algorithm
- Mark, Sweep 이후 Compact 작업까지 진행하여 흩어져있는 메모리를 모아준다.
- 하지만, Compact 작업과 이후 Reference 를 업데이트 하는 작업으로 인해 overhead 발생할 수 있다.
4) General Algorithm
- 객체 생성시 Eden 에 존재
- Minor GC
- 미사용 객체 제거.
- 사용중 객체는 Survivor1(from), Survivor2(to) 영역으로 이동. 둘 중 한 곳만 사용
- 객체의 크기가 Survior 보다 크면, Old Generation 으로 이동
- Promotion: Minor GC 반복하면서 Survivor 에서 살아남은 객체들에게 score 를 누적하여 기준 이상이면 Old Generation 으로 이동
- Full GC (Major GC) : Old Generation 이 어느 정도 커지면, 미사용 객체 모두 제거.
- STW (Stop The World) 발생. 객체를 효율적으로 제거하기 위해 JVM 이 잠시 멈춤.
Stop the World
- GC 를 수행하기 위해 JVM 이 멈추는 현상을 Stop the world 라 한다.
- GC 관련 스레드를 제외한 모든 스레드가 멈춘다.
- 일반적으로 튜닝은 Stop the world 를 최소화 하는 것을 의미한다.
GC 종류
Serial GC
- 하나의 CPU 로 Young, Old Generation 을 연속으로 처리
- Mark-and-Compact 알고리즘 사용 (GC 수행시 STW 발생)
Parallel GC
- java 7, 8 에서 default GC
- GC 작업을 병렬로 처리하여 비교적 STW 시간이 짧음: GC 진행동안 다른 CPU 가 대기 상태인 것을 최소화
- JVM option :
-XX:+UseParallelGC
CMS GC
- Concurrent Mark-Sweep GC
- 애플리케이션의 스레드와 GC 스레드가 동시에 실행되어 STW 를 최소화
- Compact 작업이 없다는 것이 Parallel GC 와 차이
G1 GC
- Garbage First GC
- java 9~ default GC (JVM 모드마다 다를 수 있음)
- JVM option:
-XX:+UseG1GC
- 큰 메모리에서 사용하기 적합.
- 대규모 Heap 사이즈에서 짧은 GC 시간 (주로 짧은 STW) 을 보장
- 전체 Heap 영역을 Region 으로 분할하여 상황에 따라 역할을 동적으로 부여
- Young Generation(Eden, Survivor), Old Generation 구분 없이 힙 메모리를 동적으로 사용
ZGC
- ZPage 영역을 사용하여, 정지 시간(STW)이 최대 10ms 를 초과하지 않도록 설계
- 힙 사이즈가 크고, 빠른 응답 시간을 필요로 하는 서버 애플리케이션에 사용하기 좋다.
- G1 GC 는 Region 크기가 고정인 반면, ZPage 는 2MB 배수로 동적으로 운영된다.
- Heap 크기가 증가하더라도 정지 시간이 증가하지 않음.
ParallelGC, CMSGC, G1GC 가 주로 사용되고, ZGC 도입 가능
728x90
'Java, Kotlin, Spring > Java' 카테고리의 다른 글
자바 애플리케이션 모니터링, javaagent, bytecode instrumentation (0) | 2023.03.20 |
---|---|
자바 힙메모리 확인, heap dump (0) | 2023.03.19 |
공변, 반공변이란 무엇일까 (0) | 2022.10.27 |
[Java] 패키지, import, 접근제어자 (64) | 2021.01.06 |
java - 상속, super, 오버라이딩, 추상클래스, final, Object 클래스 (128) | 2020.12.23 |
댓글