2022. 8. 1. 19:56ㆍJava
JVM(Java Virtual Machine)
운영체제의 메모리 영역에 접근하여 메모리를 관리하는 프로그램입니다.
메모리 관리, Garbage Collector 수행합니다.
Garbage Collector
동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능입니다.
동적으로 할당한 메모리 영역이란 자바의 Heap영역을 의미합니다.
Heap: 동적으로 할당한 메모리 영역, 모든 Object 타입의 데이터가 할당되며,
이 Heap영역의 Object를 가리키는 참조 변수는 Stack 영역에 할당됩니다.
위 그림에서 알 수 있듯 이 스택에서 더이상 참조하지 않는 Object 타입의 데이터는 GC의 대상이 되어
GC가 메모리 영역을 해제해 주기를 기다리게 됩니다.
Garbage Collector 의 과정
1. Stop the world
1. GC를 실행하기 위해선 JVM이 애플리케이션의 실행을 멈춘다. (stop)
2. stop the world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다.
3.
> GC 튜닝: stop-the-world 시간을 줄이는 것이다.
2 ( Mark & Sweep)
1. Garbage Collector 가 Stack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다. (mark)
2. 그 마킹한 객체가 참조하고 있는 객체도 찾아서 마킹한다. (mark)
3. 마킹되지 않은 객체를 heap에서 제거한다. (sweep)
즉, 참조되는 객체를 마킹한 후 마킹 되지 않은 객체를 제거하는 방식으로 진행합니다.
Garbage Collection
자바는 프로그래밍 코드에서 메모리를 명시적으로 지정하여 해제하지 않습니다.
Garbage Collector의 두 가지 전제 (Weak Generational Hypothesis)
- 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다.
- 오래된 객체에서 최신 객체로의 참조는 아주 적게 존재한다.
즉, 객체는 대부분 일회성되며, 메모리에 오랫동안 남아있는 경우는 드뭅니다.
따라서 Heap영역은 객체의 생존 기간에 따라 Old, Young 두가지의 영역으로 설계되었습니다.
Young 영역
새롭게 생성된 객체가 할당(Allocation) 되는 영역입니다.
대부분의 객체가 금방 unreachable 상태가 되기 때문에, 많은 객체가 Young영역에 생성되었다 사라집니다.
Young 영역에 대한 GC를 Minor GC라고 합니다.
Young 영역은 크게 3가지 영역으로 나뉩니다.
- Eden 영역
- Survivor 영역 (2개)
Old 영역
Young 영역에서 reacable한 상태를 유지하여 살아남은 객체가 복사되는 영역입니다.
Young 영역보다 크게 할당 됩니다. (Young 영역의 수명이 짧은 객체들은 큰 공간을 필요로 하지 않기 때문입니다)
Old 영역은 데이터가 가득 차면 GC를 실행합니다.
Old 영역에 대한 GC를 Major GC 또는 Full GC라고 합니다.
GC방식에 따라 절차가 달라지는데 GC방식은 JDK 7을 기준으로 5가지가 있습니다.
- Serial GC
- Parallel GC
- Parallel Old GC (Parallel Compacting GC)
- Concurrent Mark & Sweep GC (=CMS)
- G1(Garbage First) GC
'Java' 카테고리의 다른 글
함수형 프로그래밍 (0) | 2022.08.01 |
---|---|
Overloading vs Overriding (0) | 2022.07.22 |
String, StringBuilder, StringBuffer (0) | 2022.07.21 |
정렬(Sort) (0) | 2022.07.19 |
객체 지향 vs 절차 지향 프로그래밍 (0) | 2022.07.18 |