본문 바로가기
DevOps

[JVM] Java 가비지 컬렉션 (Garbage Collection)

by wahu 2020. 6. 17.

Garbage Collection 이란?

Java에서는 코드에서 메모리를 명시적으로 해제하지 않는다. 그렇기에 Java에서는 가비지 컬렉터가 더 이상 사용 되지 않는 객체를 찾아 지우는 작업을 한다.

 

가비지 컬렉터는 두 가지 가정하에 만들어 졌다

1. 대부분의 객체는 금방 접근 불가능한 상태가 된다.

2. 오래된 객체에서 생긴지 얼마 안된 객체로의 참조는 아주 적다.

이런 가설은 'weak generational hypothesis' 라고 한다.

 

위, 가설의 장점을 최대한 살리기 위해 크게 HotSpot VM에서는 2개의 물리적 공간으로 나누었다.

HotSpot VM은 물리적으로 크게 Young 영역, Old 영역으로 나뉜다.

 

Young 영역

- 새롭게 생성된 객체가 대부분 여기에 위치

- 대부분 객체가 금방 접근 불가능한 상태가 되기 때문에 Young영역에 생성 되었다가 사라짐

- 이 영역에서 객체가 사라질 때 Minor GC가 발생

 

Old 영역

- 접근 불가능한 상태가 되지 않아 Young 영역에서 사랑남은 객체가 여기로 복사됨

- 대부분 Young 영역보다 크게 할당하며, 크기가 크기에 Young 영역 보다는 GC가 적게 발생

- 이 영역에서 객체가 사라질 때 Major GC(Full GC) 가 발생

 

Old 영역이 Young 영역의 객체를 참조하려면?

Old 영역에는 512바이트 덩어리로 되어 있는 카드 테이블이 존재한다. 카드 테이블에는 Old 영역의 객체가 Young 영역의 객체를 참조할 때 마다 정보가 표시 된다. Young 영역에서 GC가 발생하면 Old 영역의 모든 객체를 확인하지 않고, 이 카드 테이블만 참조하여 GC 대상인지 식별한다.

 

Young 영역 GC

Young 영역은 3개의 영역으로 나뉜다.

- Eden 영역

- Survivor 영역 (2개)

 

처리 절차

1. 새로 생성한 대부분의 객체는 Eden 영역에 위치

2. Eden 영역에 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동

3. Eden 영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 객체가 계속 쌓음

4. 하나의 Survivor 영역이 가득차면 그 중 살아남은 객체를 다른 Survivor 영역으로 이동. 그리고 가득 찬 Survivor 영역은 아무 데이터도 없는 상태가 됨

5. 이 과정을 반복하다가 계속 살아남으면 Old 영역으로 이동

 

추가로, 메모리 할당을 빠르게 하기 위해 bump-the-pointer, TLABs(Thread-Local Allocation Buffers) 라는 기술을 사용한다.

 

Old 영역 GC

Old 영역은 기본적으로 데이터가 가늑차면 GC가 발생한다. GC 방식은 JDK7 기준으로 5가지 방식이 있다.

- Serial GC

- Parallel GC

- Parallel Old GC(Parallel Compacting GC)

- Concurrent Mark & Sweep GC (이하 CMS)

- G1(Garbage First) GC

 

이 중 운영서버에서 절대 사용하면 안 되는 방식은 Serial GC다. Serial GC는 데스크톱 CPU 코어가 하나만 있을 때 사용하기 위해 만든 방식이다. 이 방식을 사용하면 애플리케이션 성능이 많이 떨어진다.

 

Serial GC (-XX+UseSerialGC)

Old 영역에서의 GC는 mark-sweep-compact 라는 알고리즘을 사용한다.

 

stop-the-world 란?

GC를 수행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다. 멈추게 되면 GC를 수행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다. 어떤 GC 알고리즘을 사용하더라고 stop the world는 발생한다.

GC 튜닝이란 이렇게 JVM이 멈추는 시간을 줄이는 것이다.

 

 

 

Question

메모리에 어떤 영역에 객체가 저장 되는가?

- 힙에 저장된다.

 

Young, Old 에서 언제 GC가 일어나는가?

 

 

Young -> Old 로 언제 넘어가는가?

'DevOps' 카테고리의 다른 글

[AWS] IAM#1  (0) 2022.04.13
[Git] Style Guide  (0) 2021.11.06
[Git] git 명령어 참고  (0) 2021.10.13
[Git] Branch  (0) 2019.10.28
[Git] Reset과 Revert의 차이점  (0) 2019.10.28

댓글