Open yoonsch217 opened 1 year ago
Garbage Collection: 사용하지 않는 메모리를 해제시키는 것.
가정
GC root부터 시작해서 각각이 참조하는 객체를 반복적으로 찾아가며 mark를 하고 mark 되지 않은 객체는 삭제(sweep)한다. sweep 후에는 필요에 따라 compact 과정을 통해 메모리 단편화 현상에 대해 작업한다. GC root가 되는 객체는 JVM 메모리의 Stack 영역에 존재하는 참조 변수, Method Area의 static 데이터, JNI에 의해 생성된 객체들이다.
새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말한다. eden, survivor1, survivor2 이렇게 총 3개의 영역이 있다.
접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC)가 발생한다고 말한다.
참고로 Permanent Generation 영역(이하 Perm 영역)은 Method Area라고도 한다. 객체나 억류(intern)된 문자열 정보를 저장하는 곳이며, Old 영역에서 살아남은 객체가 영원히 남아 있는 곳은 절대 아니다. 이 영역에서 GC가 발생할 수도 있는데, 여기서 GC가 발생해도 Major GC의 횟수에 포함된다.
promotion
여러 쓰레드 중 하나의 쓰레드에서만 gc 작업이 일어나기 때문에 stw 시간이 길다. 성능이 좋지 않아서 실무에서 쓰이지 않는다.
여러 쓰레드가 동시에 gc를 수행하기 때문에 serial에 비해 stw 시간이 짧다. young 영역에 대해서만 병렬로 수행한다. java 8 이하의 default gc이다.
코어랑 메모리가 충분하다면 효율적일 수 있다.
stw 시간이 cms나 g1gc보다 길지만 순간적인 pause가 상관 없이 application 성능만 중요하다면 이게 더 적합할 수 있다.
old 영역까지 멀티쓰레드로 수행한다.
stw를 최대한 막기 위해 reachable 객체를 한 번에 찾지 않고 네 단계를 통해 찾는다.
stw 시간이 짧지만 다음의 단점이 있다. 다른 GC 방식보다 메모리와 CPU를 더 많이 사용하고 Compaction 단계가 기본적으로 제공되지 않는다. 따라서, CMS GC를 사용할 때에는 신중히 검토한 후에 사용해야 한다. 그리고 조각난 메모리가 많아 Compaction 작업을 실행하면 다른 GC 방식의 stop-the-world 시간보다 stop-the-world 시간이 더 길기 때문에 Compaction 작업이 얼마나 자주, 오랫동안 수행되는지 확인해야 한다.
java14부터 없어졌다.
Java 9+ 의 default GC이다. cms를 보완하기 위한 gc이며 기존의 young/old 영역에 대한 이미지와 다르다. G1 GC는 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다. 그러다가, 해당 영역이 꽉 차면 다른 영역에서 객체를 할당하고 GC를 실행한다. 즉, 지금까지 설명한 Young의 세가지 영역에서 데이터가 Old 영역으로 이동하는 단계가 사라진 GC 방식이라고 이해하면 된다. Heap을 Region이라는 일정한 부분으로 나눠서 메모리를 관리한다. 전체 Heap에 대해서 탐색하지 않고 부분적으로 Region 단위로 탐색하여, 각각의 Region에만 GC가 발생한다.
stw 시간이 제일 짧다.
gc failure log