목차
- Post not found: computer-science/java/gc-tunning
- JAVA - Garbage Collection(가비지 컬렉션)
- JAVA - JVM (자바 가상 머신)
JAVA - Garbage Collection(가비지 컬렉션)
동적 할당 받은 메모리 중에서 사용하지 않는 메모리를 해제해 메모리 누수를 막는 메모리 관리 기법
- memory leak 을 없앨 수 있다.
GC Root가 될 수 있는 대상들
- Stack 영역의 데이터
- Static 데이터
- JNI에 의해 생성된 객체들
Mark And Sweep 알고리즘
참조가 유효한 Object를 Reachable 참조가 유효하지 않은 Object를 Unreachable 이라고 부른다.
- Mark
- GC Root로부터 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹하는 과정
- Mark 과정에서 Reachable 한 객체와 Unreachable 한 객체를 스캔한다
- Sweep
- Unreachable한 객체를 Heap 에서 제거하는 과정
- Compact
- Sweep 후 분산된 객체들을 모아 메모리 단편화 가 이뤄지는 것을 막아준다.
Garbage Collection 작동 방식
Grabage Collection 은 크게 New Generation 에서 일어나는 Minor GC 와 Old Generation 에서 일어나는 Major GC 가 있다.
Eden
영역에 새로운 객체 가 할당된다.- Eden 영역이 가득 차게 되면 Gabage Collection 이 발생한다. (Minor GC)
- 살아 있는 객체는
Survivor 0
영역으로 이동한다. (Age 값이 증가한다.) - Unreachable 한 객체는 사라진다.
- 살아 있는 객체는
- 또 다시 Eden 영역이 가득차게되면 Eden 영역과 Survivor 0 영역을 대상으로 Gabage Collection 이 발생한다.
- 살아 있는 객체는
Survivor 1
영역으로 이동하게 된다. - 두 Survivor 공간 중 하나는 항상 비어 있어야 한다.
- 한 객체가 양쪽 Survivor 영역에 존재해서는 안된다.
- 살아 있는 객체는
- 특정 Age 값을 넘어가게 되면 Old Generation 으로 넘어가게 된다 (Promoted)
- Old Generation 영역이 가득차게 되면 Gabage Collection 이 발생한다 (Major GC)
Gabage Collection 종류
GC 는 크게 Young Generation 에서 발생하는 Minor GC 와 Old Generation 에서 발생하는 Major GC 두가지 타입으로 나뉜다.
Stop the world
Gabage Collection이 일어나는 동안 JVM 어플리케이션 실행이 멈추는 것 , GC를 실행하는 Thread 외 모든 Thread는 작업을 정지한다.
Serial GC
CPU 코어가 하나일 경우 사용하기 위한 방식으로 GC를 실행하는 Thread 가 하나다.
- 운영에서 절대 사용하면 안되는 GC
- Stop the world 시간이 다른 GC에 비해 길다.
- Mark & Sweep & Compact 알고리즘을 사용
Paralle GC
여러개의 Thread를 이용해 GC를 처리한다.
- Young 영역의 GC는 멀티 스레드 방식을 사용하기 때문에 Serial GC 에 비해 Stop The World 가 짧다.
- Java 8의 Default GC
Concurrent Mark And Sweep(CMS) GC
Stop the Wolrd 로 Application이 멈추는 현상을 줄이기 위해 만들어진 GC
Initial Mark , Concurrent Mark , Remark , Concurrent Sweep 의 4가지 과정이 있다.
- Initial Mark
- GC Root가 참조하는 객체만을 마킹한다.
- Stop the World 가 발생한다.
- Concurrent Mark
- GC 대상의 객체가 참조하는 다른 객체들을 찾아 다니면서 추가적인 GC 대상을 마킹한다.
- Remark
- Concurrent Mark 단계를 검즌하는 과정
- GC 대상이 추가적으로 확인 됐거나 참조가 제거 됐는지 등 확인한다.
- Stop The World 가 발생한다.
- Concurrent Sweep
- GC 대상을 삭제하는 과정
G1 GC
Heap 영역을 여러개의 Region으로 나누고 각 Region 에서 Young Gen 과 Old Gen 을 유동적으로 사용하는 GC
- 전체 Heap 을 탐색하는 것이 아닌 Region 단위로 탐색해 Region 단위로 GC가 발생한다.
- 현재 GC 중에서 Stop The World 가 가장 짧다.
- JDK 11 에서 G1 GC 를 default로 채택했다.