https://hyeri-dev.tistory.com/12
가비지 컬렉션(Garbage Collection, GC)의 개념
가비지 컬렉션(Garbage Collection, GC) 이란? 가비지 컬렉션(Garbage Collection, GC) Java의 메모리 관리 기법으로 애플리케이션이 동적으로 할당했던 메모리 영역 중 더이상 사용하지 않는 영역을 정리하는
hyeri-dev.tistory.com
가비지 컬렉션(GC)의 수거 대상을 참조 되고 있거나, 그렇지 않은 상태를 구분하여 주기적으로 제거한다고 했다. 그럼 어떠한 방식으로 가비지 컬렉션이 작동되고 있는걸까?
GC 동작 방식
Mark And Sweep
Mark-Sweep이란 자바, 자바 스크립트에서 사용되는 GC 알고리즘으로 루트에서부터 해당 객체에 접근 가능한지를 삭제의 기준으로 삼는다.
- Mark : Root Space로부터 그래프 순회를 통해 연결된 객체를 찾아내 각각 어떤 객체를 참조하고 있는지 찾아 마킹한다.
- Sweep : 참조하고 있지 않는 객체, 연결이 끊긴 UnReachable 객체들을 Heap에서 제거한다.
- Compact : Sweep 과정 후에 분산되어 있던 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않는 부분으로 정돈하여 메모리 파현화를 막는 과정. (필수 과정 X)
💡 Root Space
JVM GC의 Root Space는 Stack 영역의 로컬 변수, Method 영역의 Static 변수, Native Method Stack 영역의 JNI 참조를 의미한다.
Mark And Sweep의 특징
- 의도적으로 GC를 실행시켜야 한다.
- 애플리케이션 실행과 GC 실행이 병행된다.
해당 특징들은 GC를 실행하기 위해 애플리케이션이 사용하는 컴퓨터 리소스를 양보해야 하는 시점이 있다는 것을 의미하며 JVM GC를 실행시킬 특정 조건? 타이밍? 이 존재한다는 의미이기도 하다.
💡애플리케이션의 사용성을 유지하면서 효율적이게 GC를 실행하는 것은 별도의 최적화 작업이 필요하며 이를 GC 튜닝이라고 한다.
Heap 영역의 GC 과정
https://hyeri-dev.tistory.com/15
JVM 힙(Heap) 영역
Heap 영역의 변화 Java 7 JVM의 Heap 영역과 Java 8 JVM의 Heap 영역의 가장 큰 차이 점은 Permanent Generation이 사라지고 Metaspace 영역이 생겨난 것이다. 공통점 로드되는 클래스, 메서드 등에 관한 메타 정보
hyeri-dev.tistory.com
위 포스팅에서 살펴보았듯이 Heap 영역 중 Young 영역에 해당하는 부분은 Minor GC를, Old 영역에 해당하는 부분은 Major GC를 실행한다.
Mark and Sweep의 특징에서 알 수 있었듯이 GC는 GC를 실행 시킬 타이밍이 존재한다. 그렇다면 Minor GC와 Major GC는 어떤 타이밍에 작업을 수행할까?
💡 기억해야 할 점
Eden : 새로 생성된 객체가 위치하는 영역
Survior 0,1 : Eden에서 사라지지 않고 살아남은 객체들이 존재하는 영역
Old : 생명 주기가 긴 객체들, Young 영역에서 사라지지 않은 객체들이 존재하는 영역
Minor GC (Young Generation) 과정
Young Generation 영역은 생명주기가 짧은 객체들이 존재하는 공간이며, 모든 객체다 해당 영역에서 생성되게 된다. Young영역은 Old 영역에 비해 작기 대문에 메모리 상의 객체를 찾아 제거하는데 적은 시간이 걸린다.
Heap 영역을 공부하면서 단순하게 Eden -> S0 -> S1 -> Old 순으로 객체가 이동하는 줄 알았는데 그게 아니었다. S0과 S1의 특징 중 하나는 둘 중 하나의 영역은 빈 공간이어야 한다는 것이다.
1. 새로 생성된 객체들의 Young Generation 중 Eden 영역에 위치한다.
2. 계속 객체들이 생성되어 Eden 영역에 더 이상 공간이 남아 있지 않을 때, Minor GC가 발생한다.
3. Mark 과정을 통해 Reachable 객체를 탐색한다.
4. Eden 영역에서 살아남은 객체를 Survior 영역으로 이동한다.
5. Eden 영역에서 사용되지 않는 객체(Unreachable)의 메모리를 해제(Sweep)한다.
6. 살아남아 Survivor 영역에 위치된 객체들은 age-bite 값이 1씩 증가한다.
7. 또 한번 Eden 영역의 공간이 부족해지면 Minor GC가 발생한다.
8. 살아남은 객체들의 age-bite 값이 1씩 증가한다.
9. 위 과정을 반복하며 Eden에서 살아남은 객체는 Survior0과 Survior1을 옮겨가며 Age-bit 값이 증가한다.
💡Age-bit
JVM GC에서는 일정 수준의 Age-bit를 넘기면 생명주기가 길다 판단하여 해당 객체를 Old Generation으로 옮겨준다. 해당 과정을 Promotion이라고 한다.
Java 8에서 Paraller GC 방식 사용 기준 age-bit가 15가 되면 Promotion이 진행된다.
Major GC (Old Generation) 과정
Promotion에 의하여 Old Generation 영역의 메모리가 부족해지는 시기가 온다. 이때, Old Generation은 Major(Full) GC를 실행한다.
1. Old Generation 영역의 메모리 부족으로 Major GC가 발생한다.
2. Mark 과정을 통해 Reachable 객체를 탐색한다.
3. Unreachable 객체를 한꺼번에 삭제한다.
Old Gen은 Young Gen의 영역보다 큰 크기를 가지고 있기 때문에 Minor GC에 비해 Major GC의 실행 속도가 느리다.
Minor GC와 Major GC의 차이
Minor GC | Major GC | |
대상 | Young Gen | Old Gen |
실행 시점 | Eden 영역이 꽉 찬 경우 | Old 영역이 꽉 찬 경우 |
실행 속도 | 빠르다(약 0.1~0.5초) | 느리다(약 수초~ 수십초) |
Minor GC는 1초 이내로 작업이 종료되어 어플리케이션에 큰 영향을 미치지 않는다. 하지만 Major GC의 경우에는 Minor GC 실행 속도 10배 이상의 시간을 소요하므로 Stop-The World 문제가 발생한다.
💡Stop-The World
GC를 수행하기 위해 JVM이 멈추는 현상을 의미하며, GC가 작동하는 동안 GC 관련 스레드를 제외한 모든 스레드가 멈추게 된다.
Major GC가 일어나면 모든 스레드가 멈추고 GC 관련 스레드(Mark and Sweep)만 작업이 진행해야 하므로 CPU에 부하를 주고 멈추거나 버벅거리는 현상이 발생한다. 따라서 이러한 문제를 개선하기 위해 여러가지 가비지 컬렉션 알고리즘(Serial GC, Paraller GC, G1 GC 등)이 발전되어 왔다.
Reference.
https://www.youtube.com/watch?v=FMUpVA0Vvjw
https://rebelsky.cs.grinnell.edu/Courses/CS302/99S/Presentations/GC/
'Backend > Java & Kotlin' 카테고리의 다른 글
this와 super (3) | 2024.01.05 |
---|---|
[JVM]가비지 컬렉션(Garbage Collection, GC)의 알고리즘 (0) | 2023.09.12 |
[JVM] 힙(Heap) 영역 (0) | 2023.09.08 |
[Java] 리플렉션(Reflection) (0) | 2023.09.05 |
[JVM]가비지 컬렉션(Garbage Collection, GC)의 개념 (0) | 2023.09.01 |