- 가비지 컬렉터의 기본 적인 구조와 동작원리
- 가비지 컬렉터의 full gc란
- java 8 가바지 컬렉터의 특징
- 가비지 컬렉터의 기본 적인 구조와 동작원리
GC를 이해하기 위해서는 JVM의 메모리 관리에 대해 알아야 한다.
JVM에는 일반적으로 Young Generation / Old Generation 이라는 두가지의 물리적 공간이 존재한다.
- Young Generation 영역 : 새롭게 생성한 객체가 위치한다. 많은 객체가 이 영역에 생성되었다 사라지며 이를 Minor GC라고 한다.
- Old Generation 영역 : 접근불가능한 상태가 되지않아 Young 영역에서 살아남은 객체가 이 영역으로 복사된다. Young 영역보다 크게 할당되며 GC는 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC 또는 Full GC 가 발생한다.
구조는 다음과 같고 밑에서 좀 더 설명하도록 하자.
어떤 방식으로 GC가 이루어 지는지 한번 살펴보자.
- 가비지 컬렉터의 full gc란
GC의 동작원리를 알기전에 stop-the-world란 무엇인가에 대해 알아보는게 좋을 것 같다.
stop-the-world란, GC을 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다.
stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다. GC 작업을 완료한 이후에야 중단했던 작업을 다시 시작한다. 대개의 경우 GC 튜닝이란 이 stop-the-world 시간을 줄이는 것이다.
GC를 이해하기 위해서 객체가 제일 먼저 생성되는 Young 영역부터 알아보자. Young 영역은 3개의 영역으로 나뉜다.
- Eden 영역
- Survivor 영역(2개)
- 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
- Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동된다.
- Eden 영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 객체가 계속 쌓인다.
- 하나의 Survivor 영역이 가득 차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동한다. 그리고 가득 찬 Survivor 영역은 아무 데이터도 없는 상태로 된다.
- 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동하게 된다.
이것이 Young 영역의 Minor GC이다.
요약하자면 "Eden 영역에 최초로 객체가 만들어지고, Survivor 영역을 통해서 Old 영역으로 오래 살아남은 객체가 이동한다" 가 되겠다.
Old 영역은 기본적으로 데이터가 가득 차면 GC를 실행한다. 이것이 Full GC(Major GC)가 발생된다고 한다.
아까 위에 설명한 stop-the-world는 Full GC일때 발생된다.
즉, Old 영역에서 객체가 사라질때를 Full GC라고 한다.
- java 8 가바지 컬렉터의 특징
G1 GC는 Java 9부터 디폴트 GC이다.
G1 GC는 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다. 그러다가, 해당 영역이 꽉 차면 다른 영역에서 객체를 할당하고 GC를 실행한다.
즉, 지금까지 설명한 Young의 세가지 영역에서 데이터가 Old 영역으로 이동하는 단계가 사라진 GC 방식이며, 일시정지 시간(stop-the-world)을 줄이기 위해 병렬로 GC 작업하여 각각의 스레드가 자신만의 영역을 잡고 작업하는 방식이다.
G1 GC의 가장 큰 장점은 성능이다. JDK 6에서는 G1 GC를 early access라고 부르며 그냥 시험삼아 사용할 수만 있도록 한다. 그리고 JDK 7에서 정식으로 G1 GC를 포함하여 제공한다.
G1 GC는 어떤 환경일 때 효과적인가?
- Java heap의 50% 이상이 라이브 데이터. 즉, 대용량의 메모리가 있는 멀티 프로세서 시스템
- GC가 너무 오래 걸릴때(0.5 ~ 1초)
'CS (Computer Science)' 카테고리의 다른 글
멀티 쓰레드 (Thread) (0) | 2021.06.05 |
---|---|
Blocking / Non-Blocking (0) | 2021.03.01 |