JVM(Java Virtual Machine)이란?
운영체제의 메모리 영역에 접근하여 메모리를 관리하는 프로그램
-> 메모리관리, Garbage Collector 수행
Garbage Collector란?
메모리를 간단하게 관리하기 위해서 발명.
동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능.
Stack; Heap
Stack: 정적으로 할당한 메모리 영역
원시 타입의 데이터가 값과 함께 할당. Heap영역에 생성된 Object 타입의 데이터의 참조값 할당
Heap: 동적으로 할당한 메모리 영역
모든 Object 타입의 데이터가 할당. Heap영역의 Object를 가리키는 참조변수가 Stack에 할당됨
Unreachable Object?
public class Main{
public static void main(String[] args){
int num1 = 10;
int num2 = 5;
int sum = num1 + num2;
String name = "김자바";
System.out.println(sum);
System.out.println(name);
}
}
위 메인메서드가 실행되면 stack영역에
num1 =10
num2 = 5
sum = 15
name
이라는 변수가 순차적으로 쌓이게 된다.
이때 String은 객체타입이기 때문에 Heap영역에 쌓이는데
이 메인메서드가 끝나게 되면 Stack에 있는 데이터는 날아가고 Heap에 있는 객체만 남게 된다.
이러한 객체를 Unreachable Object라고 하고 이것이 Garbage Collector의 대상이 된다.
Stop the World
Garbage Collector 실행을 위해 JVM의 애플리케이션 실행을 멈추는 것.
Garbage Collector가 실행되면, Garbage Collector를 실행하는 스레드를 제외한 모든 스레드들은 작업을 멈춘다.
Garbage Collector작업이 완료된 후에 다시 작업을 시작한다.
Garbage Collector 과정 (Mark & Sweep)
1. Garbage Collector가 Stack의 모든 변수를 스캔하면서 각각 어떤 Heap영역의 객체를 참조하고 있는지 찾아서 마킹(Mark)
2. Reachable Object가 참조하고 있는 객체도 찾아서 마킹(Mark)
3. 마킹되지 않은 객체를 Heap에서 제거(Sweep)
Garbage Collection은 언제 일어날까?
Heap

1. 새로운 객체는 Eden영역에 계속해서 할당된다.
2. Eden영역의 메모리가 전부 사용되면 GC발생 (Minor)
GC가 발생되면서 Mark and Sweep과정을 거치게 되고
3. 거기서 살아남은 Reachable 객체는 Survival 0으로 옮겨진다.
(Eden영역의 Unreachable 객체는 메모리에서 해제된다.)
4. 이 과정이 계속해서 반복되고 Survival0 영역이 다 차게되면
또 Survival0영역에 대해서 Mark and Sweep 발생 .
5. 거기서 살아남은 Reachable 객체들은 Survival1 로 이동한다.
이때 Survival0 에서 Survival1로 이동한 객체들은 Age값이 1씩 증가하게 된다.
6. 다시 이 과정이 반복됨.
근데 Eden영역에서 Survival영역으로 옮겨질 땐 두 영역 중에 이미 객체가 차 있는 영역으로 객체가 쌓이게 된다.
그러므로 Survival의 두 영역 중 한 곳은 항상 비어있게 된다.
Eden에서 Survival로 바로 이동될 경우에는 age값이 증가하지 않고 옮겨짐.
7. 또 Survival1 영역에 있던 객체는 Survival0이동하게 된다.
여기서 이동한 객체는 age값이 증가한다.
8. 이 과정이 계속 반복되면서 age값이 계속 증가한다.
9. age값이 차다가 특정 값 이상이 되면 Old Generation으로 이동한다.
이 과정을 Promotion이라고 한다.
Old Generation이 데이터가 계속 쌓이다가 또 다 쌓이면 또다시 GC가 발생하는데 이 GC를 Major GC라고 한다.
참조 : 우아한Tech 10분 데코톡 https://youtu.be/vZRmCbl871I