우당탕탕
[Java] 가비지 컬렉션(Garbage Collection) 알고리즘 (가비지 컬렉션 - 2) 본문
가비지 컬렉션 알고리즘
이 글은 [Java] 가비지 컬렉션(Garbage Collection)이란? 의 2편이다.
( GC에 대한 자세한 내용은 1편을 참고 )
1편에서 GC 알고리즘 종류에 대해 말을 했었다.
1. Serial GC
2. Parallel GC
3. Parallel old GC
4. CMS(Concurrent Mark & Sweep) GC
5. G1 GC(Garbage First GC)
대충 이런 알고리즘이 있었는데 이에 대해 하나하나 알아보도록 하자
1. Serial GC
Serial GC의 경우 Young 영역과 Old 영역이 다르게 실행된다. Young 영역의 경우 1편에서 설명한 Mark Sweep 방식으로 수행되지만 Old 영역의 경우 Compact 가 추가된 Mark Sweep Compact가 사용된다. Compact란 Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 곳과 아닌 곳으로 나눈다.
쉽게 말해 다음과 같이 표현할 수 있다.
Mark-Sweep-Compact : 객체를 식별하고(Mark) -> Mark 후 살아남지 못한 것들을 제거하며(Sweep) -> Sweep 후 마지막까지 살아있는 객체들을 앞으로 모아준다. (Compact)
Serial GC의 특징으로는 GC를 처리하는 스레드가 한 개인 것이다. ( 싱글 스레드 )
또한 Serial GC의 경우 시스템 자원을 덜 사용하는 대신 속도가 굉장히 느린 특징이 있다.
2. Parallel GC
Parallel GC는 이름부터 뭔가 멀티 스레드가 가능할 것 같이 생겼다. Parallel GC는 Serial GC와 기본적인 과정은 동일하다. 차이점으로는 아까 말한 스레드의 차이이다. Parallel GC는 Young 영역에 대한 GC를 멀티스레드로 수행하며 Serial GC와 비교해서 속도가 빨라졌다.
Parallel GC의 경우 JAVA 8의 default GC이다.
3. Parallel Old GC
Parallel Old GC란 Parallel GC를 개선해서 나온 버전으로, Old 영역에 대해서는 Mark Summary Compact 알고리즘을 사용한다는 점이 차이점이다.
그럼 Sweep과 Summary는 무슨 차이 일까?
Sweep의 경우 단일 스레드가 Old 영역을 찾아 살아있는 객체만 찾아내는 방식이다. 하지만 Summary의 경우 여러 스레드가 Old 영역을 나눠 병렬적으로 찾아낸다.
4. CMS(Concurrent Mark Sweep) GC
CMS GC의 경우 STW(Stop the World)로 스레드가 중지되어 애플리케이션이 멈추는 현상을 줄이기 위해 만들어진 GC이다. Compact과정이 사라졌으며 Old 영역에서 다음과 같은 단계를 거친다.
1. Initial Mark : GC Root에서 참조하는 객체들만 마킹한다. ( 이 과정에서 STW가 발생 )
2. Concurrent Mark : 이전 단계에서 식별한 객체들이 참조하는 모든 객체를 찾는다. ( STW 없이 진행 )
3. ReMark : 이전 단계에서 식별한 객체를 다시 찾아, 추가되거나 참조가 끊긴 객체를 확정한다. ( STW 발생 )
4. Concurrent Sweep : 도달할 수 없는(Unreachable) 상태인 객체들을 삭제한다. ( STW 없이 진행 )
CMS GC의 경우 STW 시간을 줄이기 위해 만들어진 GC인 만큼 STW 시간이 매우 짧다는 장점이 있다. 하지만 CPU와 메모리를 더 많이 사용하고 Compact과정이 사라져서 Old 영역의 크기가 작거나 공간이 부족한 경우 STW 시간이 길어질 수 있다.
5. G1 GC
G1 GC의 경우 JAVA 7에서 소개되었고 JAVA 9+의 default GC이다. CMS GC를 개선하여 만들어진 버전으로 현재 GC 중 제일 짧은 STW 시간을 가지고 있다.
G1 GC에서는 기존 GC 알고리즘과 다르게 Region(지역) 개념이 새로 도입되었다. 기존 GC알고리즘에서는 Heap 영역을 Young 영역과 Old 영역을 나누어 사용했지만, G1 GC의 경우 고정된 크기, 고정된 위치에 존재하는 것이 아닌 지역이라는 특정한 크기로 나눠서 해당 Region(지역)에 역할(Eden, Survivor0,1/ Old)을 동적 할당한다.
위의 사진을 보게 되면 Humongous와 Available/Unused와 이전에 Heap 영역에서 보지 못한 영역이 존재한다. 이는 아래와 같은 의미를 가진다.
- Humongous : Region(지역) 크기의 50%가 초과되는 객체들을 저장하기 위한 공간이다. ( 이 Region에서는 GC가 느려질 수 있다 )
- Available/Unused : 아직 사용되지 않은 Region(지역)을 의미한다.
간단하게 5개의 GC알고리즘에 대해 알아보았다. 나중에 좀 더 심화적인 3편을 작성해보도록 하겠다.
Reference
'언어 > Java' 카테고리의 다른 글
[JPA] 낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)에 대해 (1) | 2023.06.16 |
---|---|
[Java] static(정적) 변수와 메모리에 대해 (0) | 2022.11.02 |
[Java] 람다 표현식, 람다(Lambda Expression)이란? (0) | 2022.09.12 |
[Java] 가비지 컬렉션(Garbage Collection)이란? (가비지 컬렉션 - 1) (0) | 2022.08.27 |
[Java] 자바(Java)란 ? (1) | 2022.08.24 |