1. 가비지 컬렉션(Garbage Collection, GC) 이란 무엇인가?
가비지 컬렉션을 그대로 번역하면 '쓰레기 수집'이다. 쓰레기를 수집하여 청소까지 하는 개념이라고 보면 되는데
Java의 메모리 관리 방법 중의 하나로 JVM (Java Virtual Machine, 자바 가상머신) 의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 더 이상 사용할 수 없게 된 영역 (= 필요 없게 된 영역) 을 해제(삭제) 하는 기능으로 보면된다.
즉, 메모리 영역에서 필요없는 메모리를 삭제하는 기능 이다.
Java나 C#의 경우는 가비지 컬렉션이 자동으로 설계되어 있어 따로 프로그램 명령어를 실행해주지 않아도 되지만,
C나 C++ 등의 프로그래밍 언어는 수동으로 설정 및 해제 해야 메모리 누수(Memory Leak) 를 막을 수 있다.
2. 가비지 컬렉션은 언제 어떻게 일어날까?
JVM의 Heap 영역에서 주기적으로 일어나는 가비지 컬렉션은 언제 어떻게 일어날까에 대해 알아보자.
가비지 컬렉션의 대상이 되는 객체를 구분하기 위해 우리는 객체가 참조하고 있는지 여부를 판단해야 한다.
여기서 우리는 도달능력(Reachability) 이라는 개념이 필요한데, 어떤 객체에 참조되는 주소가 있다면 Reachable로 구분되고, 객체에 참조되는 주소가 없다면 Unreachable로 구분이 되며 가비지컬렉션의 대상이 된다.
* Reachable : 객체가 참조되고 있는 상태
* Unreachable : 객체가 참조되고 있지 않은 상태 (가비지 컬렉션의 대상이 됨)
JVM내에서 객체들은 Heap 영역에서 생성이 되고, Stack 영역이나 Method 영역에서는 Heap영역에서 생성된 객체의 주소를 참조하는 구성입니다.
이 떄, Method가 끝나거나 하는 이벤트로 인해 Heap 영역에서 참조 변수가 삭제되는 현상이 발생하면 Heap영역의 해당 객체는 어디서든 참조하고 있지 않게 되며 이런 객체들은 Unreachable하게 되어 가비지컬렉션의 대상이 됩니다.
3. 가비지 컬렉션의 구동방식 (알고리즘)
(1) Stop - The - World
Stop-The-World란 가비지컬렉션을 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다.
STW(이하 Stop-The-World)가 발생하면 가비지컬렉션을 실행하는 쓰레드를 제외한 나머지 쓰레드들은 모두 순간적으로 STOP된다.
그 이후, 가비지컬렉션이 완료되면 다시 쓰레드를 재개한다.
밑에서 설명을 하겠지만 가비지컬렉션에서는 Minor GC와 Major GC가 있다.
이 STW는 Major GC에서 일어나며 수초 정도 걸린다.
이 STW에 걸리는 시간을 줄이는 것이 가비지컬렉션 튜닝에서 중요한 부분이다.
(2) Mark and Sweep
그대로 번역하면 Mark(표시)하고 Sweep(쓸어버린다) 는 뜻이다.
즉, 가비지컬렉션 대상을 표시한 후에 그것들을 청소하는 방식의 알고리즘이라고 보면 된다.
Sweep이후 Compact(압축)하는 과정도 포함되어 있다.
이 Mark and Sweep 기법은 메모리 할당 영역내에서 변수가 가리키는 영역을 '사용 중'으로 표시하고, 변수가 가리키지 않는 영역은 '접근 불가능한' 메모리 영역이 되며 Sweep(쓸기) 단계에서 가비지컬렉션에 의해 제거된다.
<Heap 메모리 구조>
여기서 Heap 메모리 구조에 대해서 좀 알고 가는게 좋다.
Heap은 위에서도 말했지만 객체가 생성되는 영역이며 가비지 컬렉션의 대상이 된다.
Heap영역은 다음의 가설을 전제로 설계되었다.
<Weak Generational Hypothesis>
1. 대부분의 객체는 접근 불가능한 상태(Unreachable)가 된다.
2. Old 객체에서 New 객체로의 참조는 드물게 일어난다.
이 가설을 요약하면, 대부분의 객체는 금방 접근불가능한 상태가 되어 사라지며, 오래된 객체가 되는 애들은 아주 드물다 라는 뜻입니다.
Heap 메모리 구조는 아래와 같습니다.
Young Generation 영역은 짧게 살아남는 메모리들이 존재하는 공간이고,
Old Generation 영역은 오래 살아남는 메모리들이 존재하는 공간입니다.
모든 객체는 처음 생성될 때는 Young Generation 영역에 위치하게 되며 일부만 Old Generation으로 이동되게 됩니다.
Young Generation 영역은 Old Generation 영역에 비해 상대적으로 작으며, 그로인해 해당 객체를 찾아 제거하는 시간도 상대적으로 짧습니다.
즉, Young Generation 영역에서 발생되는 가비지컬렉션(GC)를 Minor GC라 부르며
Old Generation 영역에서 발생되는 가비지컬렉션(GC)를 Major GC라 부릅니다.
Young 영역에 대해 조금 더 자세히 알아보겠습니다.
Young 영역은 아래와 같이 3개의 영역으로 나뉩니다.
Eden 영역과 Survivor 0, 1영역으로 나뉩니다.
Young 영역에서의 처리 절차를 좀 말씀드리겠습니다.
일단 새로 생성된 객체는 Young 영역의 Eden영역에 위치하게 되며
Eden영역에 객체가 꽉 차게 되면 GC가 한번 일어나고,
GC가 일어난 후에도 Reachable상태가 된 객체는 Survivor영역(0혹은 1)으로 넘어가게 됩니다.
Survivor영역으로 넘어간 후에는 Survivor영역으로 객체가 계속 쌓이게 되고 Survivor영역에 객체가 꽉 차게 되면
다시 한 번 GC가 일어나 그 중 Reachable상태가 된 객체는 다른 Survivor 영역으로 넘어가게 됩니다.
이 과정이 몇번 일어난 후에도 살아남은 객체는 Old 영역으로 넘어가게 되는 것입니다.
즉, Old 영역으로 넘어가게 되는 객체의 수는 그리 많지 않습니다.
또한, 시스템이 구동중일 때 Young 영역 내 존재하는 두개의 Survivor 영역 중 한 개의 영역은 반드시 비어있는 상태여야 합니다.
만약 두개의 survivor 영역이 모두 차있거나, 두 영역 모두 데이터가 없으면 시스템에 뭔가 문제가 생기거나 장애가 생겼다고 보셔도 될 것 같습니다.
이상으로 가비지컬렉션에 대한 설명을 마치겠습니다.
가비지컬렉션의 종류에는 여러 가지가 있고, 튜닝방법도 다양한 방법이 존재합니다.
다음시간에는 가비지컬렉션의 종류와 튜닝방법에 대해서도 알아보도록 하겠습니다.
감사합니다.
'IT 이것저것' 카테고리의 다른 글
Call by value와 Call by reference 차이 (2) | 2023.01.16 |
---|---|
[메모리] 동적할당과 정적할당 특징 비교 (2) | 2023.01.15 |
[메모리 구조] 힙(Heap), 스택(Stack) 설명 (3) | 2023.01.12 |
[언박싱] 한성컴퓨터 언더케이지 TFX4470HW 르누아르 14인치 노트북 후기 (1) | 2023.01.12 |
[티스토리]코드블럭 테마 및 폰트변경 완벽가이드 (3) | 2023.01.10 |
댓글