일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- mirror maker2
- API
- AWS
- git
- CodePipeline
- Kubernetes
- topic생성
- Kotlin
- offsetdatetime
- producer
- Spring Data JPA
- ECS
- spring
- Streams
- bean
- consumer
- centos7
- CI
- PAGING
- cd
- mysql
- JPA
- QueryDSL
- transactionaleventlistener
- Spring JPA
- spring kafka
- entity graph
- K8s
- kafka
- Entity
- Today
- Total
Yebali
[JAVA] Garbage Collection의 개념과 동작 본문
Garbage Collection이란
동적으로 할당된 메모리 영역 중 더 이상 사용되지 않는 자원을 찾아내어 메모리에서 해제하는 기능이다. 보통 GC라고 많이 부른다.
1959년 존 매카시라는 인물이 LISP의 메모리 관리를 위해 처음만들었다고 한다.
JAVA의 Garbage Collection
Java 생태계에서는 JVM의 Garbage Collector가 Heap Area에 대해 Garbage Collection을 수행한다.
Heap Area의 특징
JVM에서 GC가 일어나는 Heap Area는 아래와 같은 특징이 있다.
- new 키워드를 통해 동적을 생성되는 객체가 저장되는 공간이다.
- Heap Area에 저장된 데이터는 Garbage Collection 대상이다.
(참조되지 않으면 Garbage Collector에 의해 제거된다.) - 모든 쓰레드가 공유하는 공간이다
- JVM이 실행될 때 생성된다.
그리고 JVM의 Heap Area은 아래 두 가지를 전제로 설계되었다.
- 대부분의 객체는 금방 접근 불가한 상태가 된다.
- 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.
즉, 대부분의 객체는 일회성이고 메모리에 오랫동안 남아있는 경우는 드물다는 것이다.
이런 전제에 따라 물리적인 Heap 영역은 Young, Old 두 영역으로 나누어 설계되었다. (초기에는 Perm 영역이 존재했지만 Java8부터 제거되었다)
Heap Area의 메모리 구조
Heap Area의 메모리는 크게 Young과 Old로 나뉜다.
Young Generation
새롭게 생성된 객체가 할당되는 영역이다.
대부분의 객체가 금방 Unreachable(참조하는 곳이 없는 상태) 상태가 되기 때문에 많은 객체가 Young 영역에 생성되었다가 사라진다.
Young 영역에 대한 GC를 Minor GC라고 한다.
Young 영역은 아래 두 가지 영역으로 나뉜다.
- Eden : 막 생성된 객체들이 할당되는 영역
- Survivor 1,2: GC에서 생존된 객체들이 있는 영역
Old Generation
Young 영역에서 Reachable(참조하는 곳이 있는 상태) 상태를 유지하여 살아남은 객체가 저장되는 영역이다.
특정 횟수의 GC에서 살아남은 객체들이 저장되는 곳이다.
Young 영역보다 크게 할당되며 영역의 크기가 큰 만큼 가비지가 적게 발생한다.
Old 영역에 대한 GC를 Major GC/Full GC라고 한다.
Permanent
- Method Area의 메타 정보가 있는 영역
Garbage Collection의 동작 방식
Young 영역과 Old영역의 세부적인 GC 동작 방식은 다르지만 공통적으로 아래 두 단계를 거치게 된다.
- Stop The World : GC를 위해 JVM 애플리케이션의 실행을 멈추는 것. GC 스레드를 제외한 모든 스레드의 작업이 중단된다. 일반적으로 GC 성능개선은 Stop The World의 시간을 줄이는 작업을 말한다.
- Mark And Sweep : 사용되는 메모리와 사용되지 않는 메모리를 식별하고 사용되지 않는 메모리를 제거하는 작업.
Minor GC의 동작 방식
Young 영역은 Eden영역과 2개의 Survivor 영역으로 나뉜다. 객체가 새롭게 생성되면 Eden 영역에 할당되고 Eden 영역이 가득 차면 Minor GC가 발생하는데, 사용 중인 객체는 Survivor 영역에 옮겨지고 사용되지 않는 객체는 해제된다. Survivor 영역은 2개이지만 반드시 1개의 영역에만 데이터가 존재한다.
- 새로 생성된 객체가 Eden 영역에 할당된다.
- 객체가 계속 생성되어 Eden 영역이 가득 차게 되고 Minor GC가 발생한다.
- Eden 영역에서 사용되지 않는 객체는 메모리가 해제된다.
- Eden 영역에서 살아남은 객체는 1개의 Survivor 영역으로 이동된다.
- 1~2번 과정이 반복되다 Survivor 영역이 가득 차게 되면 Survivor 영역의 살아남은 객체들을 다른 Survivor 영역으로 이동시킨다.
(1개의 Survivor 영역은 반드시 빈 상태가 된다.) - 이러한 과정을 반복하여 계속 살아남은 객체는 Old 영역으로 이동된다.
객체의 생존 횟수를 카운트하기 위해 Minor GC에서 살아남은 횟수를 의미하는 age를 Object Header에 기록한다.
그리고 Minor GC 때 Object Header에 기록된 age를 보고 이동 여부를 결정한다.
일반적으로 0.5~1초 사이에 끝난다.
Major GC(Full GC)의 동작 방식
Major GC는 Young 영역의 객체들이 Old 영역으로 이동하여 메모리가 부족해지면 발생한다.
Old영역은 Young 영역보다 크며 Young 영역을 참조할 수 있다. 그렇기 때문에 일반적으로 Minor GC보다 오래 걸리며 10배 이상의 시간을 사용한다.
Minor GC | Major GC | |
대상 | Young Generation | Old Generation |
실행 시점 | Eden 영역이 꽉 찬 경우 | Old 영역이 꽉 찬 경우 |
실행 속도 | 빠름 | 느림 |
참고
https://hajoung56.tistory.com/43
'Backend Common' 카테고리의 다른 글
Time zone과 표준시 (0) | 2022.11.27 |
---|---|
[WebSocket] WebSocket이란? (0) | 2022.09.27 |
[JAVA] JVM의 구조 (0) | 2022.09.25 |
[Java] Java 컴파일과 실행 순서 (1) | 2022.09.25 |
쿠키, 세션 그리고 토큰 (0) | 2022.01.21 |