가비지 컬렉션 Garbage Collection이란?
프로그램을 실행하면 Heap 영역에 메모리를 동적으로 할당받은 객체들이 생겨난다. JVM의 런타임 데이터 영역 Runtime Data Area은 총 다섯 개로 나뉘는데 그중 Method나 Stack 영역과 같은 Root 영역에서는 Heap 영역에 생성된 객체의 주소를 참조하는 형식으로 구성된다. Heap 영역의 객체들은 해당 객체의 주소를 가리키고 있는 참조 변수가 삭제되는 경우 참조되고 있는 상태(Reachable)에서 참조되고 있지 않은 상태(Unreachable)로 바뀌고 시스템 내에서 더 이상 사용되지 않는 가비지가 된다. 가비지 컬렉션은 Heap 영역에 존재하는 Unreachable 한 객체를 주기적으로 제거하여 해당 객체가 불필요하게 점유하고 있던 메모리를 해제해주는 것을 의미한다. 시스템 내에서 가비지 컬렉션 기능을 수행하는 프로그램을 가비지 컬렉터 Garbage Collector라고 한다.
지금까지의 설명으로 눈치챘겠지만 가비지 컬렉터의 대상이 되는 메모리 영역은 Heap 영역이다.
Heap 영역이 뭐지?
메모리 구조에 대한 내용은 아래 포스팅을 참고.
메모리 구조(코드, 데이터, 스택, 힙)
메모리 구조(코드, 데이터, 스택, 힙) 컴퓨터의 운영체제(OS)는 프로그램 실행을 위해 해당 프로그램을 메모리(RAM)에 로드한다. 메모리는 낮은 주소(Low address)에서 높은 주소(High address) 순으로 코
min-ism.tistory.com
JVM이 뭐지?
JMV(자바 가상 머신)에 대한 내용은 아래 포스팅을 참고.
JVM, Java Virtual Machine
JVM, Java Virtual Machine - References https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94
min-ism.tistory.com
Java나 Kotlin의 경우 JVM의 가비지 컬렉터가 메모리 관리를 해주지만 C 언어의 경우 개발자가 직접 메모리 할당과 해제를 해주어야 한다. 동적 할당된 메모리가 사용되지 않는 시점에 반환되지 않고 계속해서 불필요한 메모리를 점유하고 있는 경우 메모리 누수가 발생했다고 하는데, 가비지 컬렉터가 있으면 이러한 메모리 누수를 해결하는데 도움이 된다.
✔ JVM의 Heap 영역 구조
JVM의 Heap 영역은 대부분의 객체는 금방 Unreachable한 상태가 되고, 오래된 객체에서 새로운 객체로의 참조는 아주 적게 일어난다는 가정 하에 설계되었다. 객체의 생존 기간이 짧은지 아닌지에 따라 JVM의 물리적인 Heap 영역은 Young/Old/Permanent 셋으로 나뉜다. Java8 이후 Permanent 영역은 Metaspace로 변경되었고 JVM의 Heap 영역이 아니라 Native Memory에 위치하는 것으로 바뀌었기 때문에 이후 논의에서는 Young 영역과 Old 영역에 대해서만 다룬다.
Young Generation
- 새롭게 생성된 객체가 할당(Allocation)되는 영역이다.
- 대부분의 객체가 금방 접근 불가능한 상태가 되기 때문에 많은 객체가 이 영역에 생성되었다가 사라진다. 수명이 짧은 객체들은 큰 공간을 필요로 하지 않고, 또 금방 사라지기 때문에 영역의 크기가 크지 않아도 된다.
- Young 영역에서 실행되는 GC를 Minor GC라고 한다.
Old Generation
- Young 영역에서 살아남은 객체가 넘어오는(Promotion) 영역이다.
- 수명이 길고 큰 객체들이 존재해야 하기 때문에 Young 영역에 비해 크게 할당되며 영역의 크기가 큰 만큼 가비지가 적게 발생한다.
- Old 영역에서 실행되는 GC를 Major GC 혹은 Full GC라고 한다.
✔ 가비지 컬렉션의 실행 단계
Minor GC든 Major GC든 개략적으로 아래와 같은 실행 단계를 거친다.
1. Stop The World
가비지 컬렉션을 수행하기 위해 JVM이 GC를 실행하는 스레드를 제외한 다른 스레드들의 작업을 중단시키는 것을 의미한다. GC 튜닝을 한다고 하면 보통 이 Stop The World 시간을 줄이는 것을 목표로 한다.
2. Mark And Sweep
- Mark: 연결된 객체들을 찾아낸 뒤 각각 어떤 객체를 참조하고 탐색하며 사용되고 있는 메모리 식별
- Sweep: 참조 관계가 없는, 즉 Unreachable한 객체들을 Heap 영역에서 제거
- Compact: 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축(가비지 컬렉터의 종류에 따라 Compact 과정이 생략되기도 함)
✔ 가비지 컬렉션의 세부 실행 과정
Minor GC의 동작 과정
Young 영역은 1개의 Eden 영역과 2개의 Survivor 영역으로 나뉜다.
- Eden 영역: 새로 생성된 객체가 할당(Allocation)되는 영역
- Survivor 영역: 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역
1. 객체가 생성되면 Young 영역의 Eden 영역에 age-bit 0으로 할당(Allocation) 된다.
age-bit는 객체의 생존 횟수를 의미하며 Minor GC에서 살아남을 때마다 1씩 증가한다.
2. Eden 영역에 객체가 다 쌓이면 Minor GC가 실행된다.
Eden 영역이 가득 차면 Stop The World 상태에 들어간다. Mark and Sweep 알고리즘에 따라 Eden 영역에서 사용되지 않는 객체의 메모리는 해제되고, 사용되는 객체는 Survivor 영역으로 이동, 해당 객체의 age-bit가 1씩 증가한다.
* Survivor 영역에 우선순위는 없다. Suvivor 영역 중 1개는 반드시 사용되어야 하며, 반드시 둘 중 1개의 영역에만 데이터가 존재해야 한다.
3. 1번과 2번이 반복되어 Eden 영역에 객체가 다 쌓이게 되면 Minor GC가 다시 실행된다.
Mark and Sweep 알고리즘에 따라 Young(Eden+Servivor) 영역에 있는 객체들 중 사용되지 않는 객체의 메모리는 해제되고 사용되는 객체는 비어있는 Survivor 영역으로 이동, 해당 객체의 age-bit가 1씩 증가한다. 이 과정을 계속 반복한다.
4. 특정 age-bit에 도달한 객체를 Young 영역에서 Old 영역으로 이동시킨다(Promotion).
Survivor에 있는 객체의 age-bit가 JVM에서 설정해놓은 age-bit에 도달하게 되면 오랫동안 쓰일 객체라고 판단하고 Old 영역으로 이동시킨다(JVM의 age-bit는 0~15 사이의 범위 내에서 설정할 수 있다).
Major GC의 동작 과정
Old 영역의 메모리가 부족해지면 Major GC가 실행된다. Major GC는 일반적으로 Minor GC에 비해 10배 이상의 시간이 소요된다. 이때도 물론 Stop The World 상태에 들어가기 때문에 Major GC가 너무 빈번하게 일어나면 프로그램 성능에 부정적인 영향을 줄 수 있다.
✔ 가비지 컬렉터의 한계
가비지 컬렉터에도 한계는 존재한다.
1. 개발자가 메모리 해제 시점을 정확히 알 수 없다.
2. 가비지 컬렉션이 동작하는 동안에는 그외 다른 프로세스가 멈추기 때문에 오버헤드가 발생한다.
3. 가비지 컬렉션만으로 메모리 누수를 완벽하게 해결할 수는 없다.
- References
가비지 컬렉션, 컬렉터(Garbage Collection)란?
Garbage Collection, 줄여서 약어로 GC라고도 부른다. 영어로 그대로 읽어서 가비지 컬렉션이라고 부른다. 메모리 관리 방법 중에 하나로, 시스템에서 더이상 사용하지 않는 동적 할당된 메로리 블럭
blog.metafor.kr
[Java] Garbage Collection(가비지 컬렉션)의 개념 및 동작 원리 (1/2)
1. Garbage Collection(가비지 컬렉션)이란? [ Garbage Collection(가비지 컬렉션)이란? ] 프로그램을 개발 하다 보면 유효하지 않은 메모리인 가바지(Garbage)가 발생하게 된다. C언어를 이용하면 free()라는 함
mangkyu.tistory.com
Minor GC - Eden에서 Survivor 영역으로
johngrib.github.io
[Java] 가비지 컬렉션(GC, Garbage Collection) 총정리
가비지 컬렉션(Garbage Collection)이란? 가비지 컬렉션은 영어로 Garbeage Collection으로 줄여서 GC라고도 부릅니다. 가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로
coding-factory.tistory.com
JVM의 Runtime Data Area · 안녕 프로그래밍
자바는 운영체제 독립적으로 JVM 환경에서 동작할 수 있도록 설계가 되어 있는 동적 언어 이다. 자바 프로그램이 시작되고 종료 될 때까지 자바의 소스코드가 어떠한 형태로 JVM의 메모리에 할당
www.holaxprogramming.com