- GC의 동작원리 및 언에 작동하는지
※ Stack 과 Heap 영역
- Stack 영역: 정적으로 할당한 데이터영역.
- 원시 타입 데이터가 값과 함께 할당, Heap 영역에 생성된 Object 타입의 데이터의 참조 값 할당하는 영역.
- Unreachable Obejct
- Heap 영역: 동적으로 할당한 메모리 영역 ( new )
- 모든 Object 타입의 데이터가 할당되어 있고, Heap영역의 Object를 가르키는 참조변수가 Stack에 할당.
- Reachable Object
Garbage Collector란
사용되고 있지 않은 메모리를 알아서 해제해주는 역할을 한다.
c와C++에서는 개발자가 직접 메모리를 해제한다. 하지만 자바는 GC가 대신 안쓰는 메모리를 찾아서 해제해준다.
Garbage Collector 장점과 단점
장점
- 유효하지 않은 포인터 접근을 방지할 수 있다.
- 해제된 메모리에 접근하는 버그.
- 이중 해제를 방지 할 수 있다.
- 메모리 누수를 방지 할 수 있다.
단점
- 어떤 메모리를 해제할지 결정하는데 비용이 든다.
- 객체가 필요 없어지는 시점은 프로그래머만 알고 GC는 모른다. 그래서 GC알고리즘이 메모리 해제 시점을 추적해야하 하는 오버헤드가 발생한다.
- GC가 일어나는 타이밍이나 점유 시간을 예측하기 어렵다.
- 프로그램이 예측 불가능하게 일시적으로 정지 할 수있으므로 실시간 시스템에는 적합하지 않다.
- GC가 발생하면 GC외 다른 스레드는 모두 정지한다.(Stop the World)
Garbage Collector 작동 원리
- Stack의 모든 변수를 스캔하면서 가각 어떤 객체를 참조하고 있는지 찾아서 마킹한다.
- Reachable Obejct가 참조하고 있는 객체도 찾아서 마킹.
- -------- 여기까지 'Mark' 라는 과정 ------------------------------------------
- 마킹 되지 않은 객체를 Heap에서 제거한다.
- -------- 여기까지 'Sweep' 이라는 과정 ---------------------------------------
요약하자면 참조 되고 있는 객체들을 마킹하고 참조되지 않은 객체들을 모두 모아 비워준다.
Garbage Collector 발생 시기
- 새로운 객체 생성 모두 Eden 영역으로 할당된다.
- Eden 영역이 가득차면 GC가 발생한다. 여기서의 GC는 Minor Gc이다(Sweap & mark 과정 수행)
- Eden 영역이 가득차면
- Survivor 0으로 이동한다.
- Survivor 0이 가득차면 Minor GC가 등장한다.(Sweap & mark과정을 수행)
- S1으로 이동한다.+ (age 값을 증가시켜준다 ++)
- ※ s1이 가득차면 버리는 것인가?
- s0으로 간다.
- ageing 해준다.
- s0과 s1을 번갈아가면서 채워준다. 단 하나는 비워있어야 한다.
- 전체적인 흐름은 새로운 객체들을 모두 Eden영역으로 들어와 꽉차면 s0,s1중 어느정도 채워진 부분에만 채워넣는다. 즉 하나는 항상 비워둔다.
- s0 s1으로 계속적으로 aging하다가 어느정도 일정 값에 도달하면 old Generation 부분으로 이동한다.
- 이 과정을 'Promotion'이라고 한다.
- Old 영역도 꽉차면 GC가 발생한다.
- GC는 Major GC이다. (Sweap & Mark 과정을 수행한다)
'JAVA' 카테고리의 다른 글
static (0) | 2021.05.04 |
---|---|
가비지 콜렉터의 종류 (0) | 2021.05.03 |
Reflection (0) | 2021.04.16 |
제네릭 타입의 컴파일 영향 (1) | 2021.04.10 |
자바의 compile 과정 (0) | 2021.04.04 |
댓글