일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
- BitBucket
- SMTP
- go
- Fluentbit
- JVM
- Java
- goroutine
- DKIM
- SPF
- 메일 인증 프로토콜
- Ingress
- aws
- Datadog
- Certified Solutions Architect
- K8S
- EKS
- Lambda
- Kubernetes
- SAA-CO2
- serverless
- aws ses
- docker
- dMarc
- SAA
- awscli
- Fargate
- 도커
- SAA-CO3
- gochannel
- Today
- Total
DevOps Tasks
[JAVA ] GC (Garbage Collection) Master 본문
Garbage Collection(GC) 이란?
가비지 컬렉터(Garbage Collection, GC)은 JAVA 프로그램에서 동적으로 할당된 메모리 중에서 더 이상 사용되지 않는 객체를 자동으로 찾아 제거하는 자바의 메모리 관리 기술이다.
이를 통해 개발자는 명시적으로 메모리 해제를 처리하지 않아도 되며, 런타임 환경에서 메모리 누수를 방지할 수 있다.
GC 전에 JVM에 대한 자세한 내용은 아래 글에 있다.
GC Algorithm
이렇게 GC는 메모리를 확보하는 데 꼭 필요하지만 실행 시 애플리케이션의 Thread를 일시적으로 중지하기 때문에 지연 시간이 발생할 수 있다.
이상적으로는 JVM 은 필요한 메모리를 확보할 수 있을 만큼 GC를 자주 실행시켜야 하지만 자주 실행시키게 되면 Thread를 일시적으로 중지시키기 때문에 애플리케이션 활동에 방해가 될 수 있다.
Java 9 부터 Garbage-First garbage collector (G1 GC)가 기본 수집기이다.
Garbage Collector 종류
Serial GC
싱글 스레드로 동작하는 GC 방식이고 그만큼 느리고 STW 시간도 다른 GC에 비해 길다.
Mark & Sweep & Compact 알고리즘을 사용하고 보통 실무에서 사용하는 경우는 없고 다만 CPU가 1 코어인 경우에만 사용된다.
JAVA_OPTS = XX:+UseSerialGC
Parallel GC
Parallel GC는 Minor GC를 처리하는 Thread를 여러 개로 늘려 병렬로 처리하여 Serial GC 보다 훨씬 빠르게 동작하는 방식이다.
( Old Region 은 아님)
Serial GC보다 STW 시간이 훨씬 짧고 Java 8에서 Default GC이다.
JAVA_OPTS = XX:+UseParallelGC
Parallel Old GC
Parallel GC 가 Young 영역에 대해서만 Multi-Thread 방식을 사용했다면, Parallel Old GC는 Old Region Multi-Thread 방식을 사용한다.
# 옵션으로 멀티 스레드 개수를 지정할 수 있다.
JAVA_OPTS = XX:+UseParallelOldGC , XX:+ParallelGCThreads=n
CMS GC(Concurrent Mark Sweep GC)
Stop The World로 Java Application 이 멈추는 현상을 줄이고자 만든 GC
접근 가능한 객체를 한 번에 찾지 않고 4 단계로 나눠서 찾는 방식을 사용한다.
Initial Mark : GC Root가 클래스 로더에서 가장 가까운 객체 중 Live 객체만 Marking
→ STW 발생
Concurrent Mark : 참조하는 객체를 따라가면서 지속적으로 Marking
→ STW 없음
Remark : Concurrent Mark 단계에서 새로 추가되거나 참조가 끊긴 객체를 확인한다.
→ STW 발생
Concurrent Sweep : 참조되지 않는 객체를 삭제한다.
→ STW 없음
G1 GC (Garbage First GC)
Java 9+ 에서 Default GC (Oracle JDK 7 update 4 이상 릴리즈에서 지원은 가능)이고 현재 GC 중 STW의 시간이 제일 짧다.
CMS GC를 개선하여 만든 GC로 리전 형식의 구조를 갖는다.
다른 GC 들과는 다르게 Eden, Survivor, Old 영역이 고정된 크기가 아니며 전체 Heap Momory 영역을 Region이라는 특정한 크기로 나눈다.
Region의 상태에 따라 그 Region의 역할( Eden, Survivor, Old )이 동적으로 바뀐다.
Region은 기본적으로 ( 전체 Heap Memory / 2048 )로 지정된다.
시나리오에 따라 다르겠지만 보편적으로 Java 9+ 를 사용하기 때문에 G1 GC에 대해서만 알고 있으면 된다.
용어 정리
용어 | 내용 |
Evacuation | G1 GC 에서 일어나는 객체의 Copy 및 Moving 을 말한다. |
Region | G1 GC 에서 관리하는 Heap Memory 영역을 고정된 크기로 나눈 것이다. |
Humongous Region | Region 크기의 50% 를 초과하는 큰 객체를 저장하기 위한 공간으로 G1 GC에서 별도로 관리하는 영역이 되고 해당 Region 에서는 GC 가 최적으로 동작하지 않는다. |
Available / Unused Region | 아직 사용되지 않은 Region, Evacuating 때 이동 대상이 된다. |
Collection Set | GC 에서 수집된 영역의 집합이고 CSet 이라고도 불린다. 이 영역의 기록된 모든 영역은 GC 중 비워지게 된다. 전체 Heap 공간의 1% 미만을 차지한다. Eden, Survivor, Old Gen 이 기록될 수 있다. |
Remembered Set | 하나의 Region 마다 하나 씩 주어지는 영역이고 RSet 이라고도 불린다. 주어진 영역의 외부 참조를 추적하고 기록하는 곳이다. 전체 Heap 공간의 5% 미만을 차지한다. Region의 병렬적이고 독립적인 GC 가 가능하게 된다. |
MixedCollection | Young / Old Region 의 GC 를 포기하는 것을 Mixed GC or MixedCollection 이라고 한다. |
Full GC | Heap 전반적으로 GC가 발생하는 것이다. |
Stop The World | JVM 이 Major GC 를 수행하기 위해 애플리케이션의 GC 를 수행하는 Thread 이외의 모든 Thread 를 멈추는 상황이다. GC 성능 개선은 보통 Stop The World 시간을 줄이는 작업으로 볼 수 있다. 이러한 문제를 해결하기 위해 JVM 에서는 다양한 실행 옵션을 제공하고 ”STW “라고 불린다 |
Mark | 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업이다. |
Sweep | Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업이다. |
How the G1 Collector Organizes the Heap
G1 은 힙을 여러 영역으로 균등하게 나눈다.
크게 Young Generation (Young Gen)과 Old Generation (Old Gen)으로 할당한다.
Young Generation 은 Eden 영역과 Survivor 영역으로 구성되고 Old Generation 은 Old 영역과 Humongous Regions(한 영역 메모리의 50% 이상을 요구하는 큰 객체를 저장하기 위한 영역)으로 구성된다.
Humongous Regions 객체를 제외하고 새로 할당된 객체는 Young Gen의 eden 영역에 할당된 다음 살아남은 가비지 수집 수에 따라 Survivor 또는 Old Gen으로 이동하게 된다.
Phases of G1 Garbage Collection
Java Application 이 실행되면 GC는 어떠한 객체가 계속 사용되고 있는지 참조되고 있는지 ( ” LIVE ” 객체 ) , 어떤 객체가 더 이상 필요하지 않고 ( ” DEAD ” 객체 ) Heap에서 제거할 수 있는지에 대한 리스트를 나열한다.
보통, GC 가 라이브 객체를 다른 영역으로 이동시킨 후에 모든 애플리케이션 활동이 일시적으로 중단되는 경우가 생기는데
이 현상은 더 많은 메모리를 복구하기 위해 압축 작업을 진행할 때 발생한다.
• Full GC는 heap 전반적으로 GC가 발생하는 것을 뜻한다.
G1의 가비지 수집 주기
G1의 가비지 수집 주기는 Young-Only 단계와 Space-Reclamation 단계를 번갈아가며 진행한다.
간단하게
Young-Only 단계는 현재 사용 가능한 메모리를 Old Gen의 객체로 점진적으로 채우는 GC 작업
Space-Reclamation 단계는 G1 이 Young Gen을 처리하는 것 외에도 Old Gen의 공간을 점진적으로 재 확보하는 단계로
가비지 수집 주기는 이런 사이클을 반복한다.
Young-Only 단계
일반적인 GC에서 Young Region의 Generation 이 이루어지는 곳이고 Old 승격까지 이루어진다.
Young-Only 단계와 Space-Reclamation 단계 사이의 전환은 Old Gen 점유율이 특정 임계값 ( Initiating Heap Occupancy )에 도달했을 때 시작된다.
이때, G1 은 Normal Young Collection 대신 Concurrent Start Young Collection을 예약한다.
Young GC는 객체의 나이에 따라서 Live 객체를 Eden 영역에서 → Survivor 영역으로 or Survivor 영역에서 → Eden 영역으로 이동시킨다.
Marking Cycle 은 Old Generation Region의 실제 객체 목록을 파악하고 G1 은 Old Generation의 일정 비율을 점유하고 있다는 것을 감지하면 공간 재확보 단계를 준비하기 위해 이 프로세스를 시작한다.
Marking Cycle의 일부 단계는 애플리케이션과 동시에 실행된다. 실행되는 동안 JVM 은 필요에 따라 애플리케이션에 메모리를 계속 할당할 수 있다.
GC 가 Marking Cycle을 성공적으로 완료하면 일반적으로 Space-Reclamation 단계로 전환된다.
G1 수집기가 Mixed Collection 이 “Pause Time Goal ( 원하는 최대 Stop The World Pauses ) ”을 초과하지 않고 Old Gen Region을 충분히 비웠다고 판단하면, Young-Only 단계가 다시 시작된다.
하지만 G1 수집기가 Marking Cycle을 완료하기까지 사용 가능한 메모리가 부족하다면 Full GC를 시작할 수 있다.
Full GC는 선택된 영역 대신 전체 Heap에 걸쳐 객체를 이동시키기 때문에 일반적으로 Young-Only or Mixed Collection 보다 시간이 더 오래 걸린다.
GC 수집 로그를 통해서 Full GC 가 발생하는 빈도를 추적할 수 있다.
Space Reclamation 단계
멀티 스레드로 동작하며 Young Gen Region 외에도 Old Gen Region의 Live 객체를 이동시키는 여러 컬렉션으로 구성된다.
해당 단계는 G1이 더 많은 Old Gen Region을 비워도 충분한 여유 공간이 확보되지 않는다고 판단하면 종료된다.
가비지 컬렉션(GC)은 Java의 메모리 관리 방법 중 하나로, 더 이상 필요하지 않은 메모리 객체를 주기적으로 제거하여 효율적인 메모리 사용을 도와준다.
다양한 GC 알고리즘이 있으며, Java 9부터는 Garbage-First garbage collector (G1 GC)가 기본 수집기로 사용된다.
GC는 메모리 확보 작업 중에 일시적인 중지가 발생할 수 있으나, 이를 최소화하기 위한 여러 알고리즘이 존재한다.
G1 GC는 Young-Only와 Space-Reclamation 단계를 번갈아가며 수행하여 메모리를 효율적으로 관리하고, Stop The World(STW) 시간을 최소화하여 애플리케이션 성능을 향상시킬 수 있다.
GC의 올바른 선택과 설정은 애플리케이션의 특성에 따라 다르며, 이를 통해 안정적이고 효율적인 애플리케이션 운영이 가능하다.
Java의 가비지 컬렉션은 개발자가 명시적으로 메모리 관리에 신경쓰지 않아도 되게끔 도와주는 중요한 기능이며, 각 GC 알고리즘에 대한 이해와 올바른 설정은 Java 개발자에게 필수적인 역량이다.
'DevOps' 카테고리의 다른 글
메일 인증 프로토콜로 제로 스팸 메일 만들기 - DKIM Part (0) | 2024.02.04 |
---|---|
메일 인증 프로토콜로 제로 스팸 메일 만들기 - SPF Part (0) | 2024.02.04 |
[JAVA ] JVM (Java Virtual Machine) Master (1) | 2024.01.28 |
Obsidian 알아보기 (0) | 2024.01.20 |
Git 이란? (0) | 2024.01.06 |