가비지컬렉터(Garbage Collector)
by 키위먹고싶다Garbage Collectior?
동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 해지하는 메모리 관리 방법이다. 자바에서는 JVM의 Heap영역의 불필요한 객체를 가비지 컬렉터가 알아서 정리한다.
Mark And Sweep 알고리즘
root space부터 그래프 순회를 통해 연결된 객체를 찾아내고(mark) 연결이 끊어진 객체를 지운다.(sweep) sweep이후에는 분산되어 있던 메모리가 잘 정리되는데 이것은 메모리 파편화를 방지하는 compaction과정이며 모든 MarkAndSweep알고리즘에서 compaction과정이 필수는 아니다. 의도적으로 GC를 실행해야 한다는 특징이 있는데 애플리케이션이 GC에게 컴퓨터 리소스를 내주어야 하기 때문에 애플리케이션의 사용성을 유지하면서 효율적으로 GC를 실행해야 하는 것이 중요하다.
young과 old를 나눈 이유
GC설계자들이 애플리케이션을 분석한 결과 대부분의 객체의 생명주기가 짧을 것을 깨닫고 비용이 드는 작업인 GC를 메모리 전체 부분이 아니라 특정 부분만 탐색하고 해제해야 효율적이므로 최대한 Young영역에서 메모리를 해제해도록 설계한 것이다.
Young 영역
새롭게 생성된 대부분의 객체가 여기에 위치했다가 사라진다. Young영역은 1개의 Eden영역과 2개의 Survivor영역 총 3가지 영역으로 구성된다.
- 객체가 새로 생성되면 Eden영역에 위치한다.
- Eden이 가득 차면 GC가 발생한다. (Minor GC)
- Eden에서 참조되지 않는 객체의 메모리는 해제되며, 살아남은 객체들은 Survivor 영역 중 한 곳으로 이동한다.
- 사용되던 Survivor이 가득 차면 살아남은 객체들의 age를 증가시키고 다른 Survivor영역으로 이동한다. 이때 원래 사용되던 Survivor은 모두 비워진다.
- 위 과정이 반복되면서 살아남은 객체의 age값이 특정 값 이상이 되면 Old영역으로 Promotion 한다.
stop - the - world
GC를 실행하기 위해 JVM이 GC를 실행하는 스레드 외의 모든 스레드의 작업을 중단시킴. GC의 종류에 따라 stop the world의 실행시간이 달라진다.
GC종류
old영역의 GC는 GC종류에 따라 처리 절차가 달라진다.
Serial GC
- GC를 처리하는 스레드가 1개이다.
- 그래서 stop-the-world의 시간이 길다.
- 싱글 스레드나 heap영역이 매우 작을 때 사용되는 방식이다.
- 메모리 단편화를 막기 위한 Compaction과정이 필요하다.
Parallel GC
- Young영역의 GC를 처리하는 스레드가 여러 개라서 Serial GC보다 stop-the-world의 시간이 감소하여 GC의 속도가 빠르다.
- 멀티코어 환경에서 애플리케이션 처리 속도를 빠르게 하기 위해 사용되며 자바 8에서 기본으로 쓰이는 GC이다.
- 그래도 애플리케이션이 멈추는 것은 피할 수 없다.
Parallel Old GC
- Parallel GC를 개 시원한 것으로 Old영역에서도 멀티스레드 방식의 GC가 수행된다.
Concurrent Mark Sweep) CMS GC
- stop the world의 시간을 최소화하기 위해 등장하였다.
- GC수행 시 다른 스레드가 멈추지 않고 작업을 진행시킨다.
- compact과정이 없기 때문에 메모리 단편화 문제가 발생한다.
G1 GC
- CMS의 메모리 단편화 문제를 해결하기 위해 heap영역을 young과 old를 나누지 않고 Region이라는 일정한 크기로 나눈 구조인데
- 전체를 marking 하는 것이 아니라 garbage만 있는 Region을 수거함.
- 자바 9 버전부터 기본 GC의 방식으로 선택되었다.
'java' 카테고리의 다른 글
자바 동기화 클래스 (0) | 2022.06.28 |
---|---|
자바의 메모리 구조 (0) | 2022.04.08 |
JVM 클래스로더 (0) | 2022.01.22 |
자바의 실행과정(JVM,JIT) (1) | 2022.01.15 |
stream에 대한 정리 (0) | 2021.12.22 |
블로그의 정보
kiwi
키위먹고싶다