이것저것
가비지 컬렉션(Garbage Collection)이란? 본문
[가비지 컬렉터란?]
가비지 컬렉터란 "더 이상 참조되지 않는 메모리"인 가비지를 청소해주는 JVM 의 실행 엔진의 한 요소이다. JVM은 new와 같은 연산자에 의해 새롭게 생성된 객체들 중에 더 이상 참조되지 않는 객체를 정리해준다. 가비지 컬렉터는 Heap 영역을 위주로 탐색하여 메모리를 정리해준다.
[Stack, Heap]
Stack : 정적으로 할당한 메모리 영역
Primitive 타입의 데이터 값과 함께 할당, Heap 영역에 생성된 Object 타입의 데이터의 참조 값 할당
Heap : 동적으로 할당한 메모리 영역
모든 Object 타입의 데이터가 할당, Heap 영역의 Object를 가리키는 참조 변수가 Stack에 할당
public class Main{
public static void main(String[] args){
int num1 = 10;
int num2 = 5;
int sum = num1 + num2;
String name = "abc";
System.out.println(sum);
System.out.println(name);
}
}
string : "abc" | |
name | |
sum = 15 | |
num2 = 5 | |
num1 = 10 | |
stack | heap |
메인 메서드가 끝나게 되면 스택 영역이 pop되며 heap 영역에 있는 데이터만 남게되고 이를 "unreachable object"라 하고 GC의 대상이 된다.
[가비지 컬렉션의 과정]
1. GC가 stack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다. (Mark)
2. Reachable Object가 참조하고 있는 객체도 찾아서 마킹한다. (Mark)
3. 마킹되지 않은 객체를 Heap 에서 제거한다. (Sweep)
(참조되는 객체를 마킹하고 그 외에 것은 삭제한다.)
가비지 컬렉션 (GC)는 메모리를 정리하는 과정이다.
그렇기 때문에, 일반적으로 메모리의 사용을 중단한 채로 진행이 되어야 한다. JVM은 GC를 실행하기 위해 애플리케이션의 실행을 멈추는 stop-the-world를 먼저 실행한다. stop-the-world를 실행하면 GC를 실행하는 쓰레드를 제외한 모든 쓰레드가 작업을 멈춘다. 그리고 GC가 끝나면 다시 작업을 재개한다. GC의 작업은 Heap의 Young 영역에 대한 Minor GC 와 Old 영역에 대한 Major GC로 구분된다.
- Young 영역 : 새롭게 생성한 객체들이 위치한다. 대부분의 객체는 금방 접근 불가능한 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다.
- Old 영역 : Young 영역에서 계속 사용되어 살아남음 객체가 복사되는 영역이다. Young 영역보다 크게 할당되며, 더 적은 GC가 발생한다.
Young 영역은 또 1개의 Eden 영역과 2개의 Survivor 영역으로 구성되는, Young 영역에 대한 GC는 다음과 같이 작동한다.
(1) 새로운 객체가 Eden 영역에 생성
(2) Eden 영역에 GC가 동작하고, 그 중에서 살아남은 객체들이 Survivor0 으로 이동한다.
(3) (2) 번 동작이 반복되어 Survivor0 이 꽉차게 된다.
(4) Survivor() 영역에 GC가 동작하고, 살아남은 객체들은 Survivor1 으로 이동하고, Survivor 0 을 비우게 된다.
(5) 위 동작들이 반복되어 특정 횟수만큼 살아남은 객체는 Old 영역으로 이동한다.
그리고 Old 영역이 가득차서 Survivor 영역에서 Old 영역으로 Promotion 이 불가능할 때 Old 영역에 대한 GC (Major GC)가 실행된다.
'Java' 카테고리의 다른 글
static 변수와 static 메서드 (0) | 2021.05.12 |
---|---|
자바 데이터 타입, 변수 그리고 배열 (0) | 2021.04.26 |
OOP 란? (0) | 2021.04.20 |
JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가? (0) | 2021.04.18 |