yoonsch217 / archive

0 stars 0 forks source link

Garbage Collection #6

Open yoonsch217 opened 1 year ago

yoonsch217 commented 1 year ago

gc failure log

yoonsch217 commented 1 year ago

개념

Garbage Collection: 사용하지 않는 메모리를 해제시키는 것.

가정

GC root부터 시작해서 각각이 참조하는 객체를 반복적으로 찾아가며 mark를 하고 mark 되지 않은 객체는 삭제(sweep)한다. sweep 후에는 필요에 따라 compact 과정을 통해 메모리 단편화 현상에 대해 작업한다. GC root가 되는 객체는 JVM 메모리의 Stack 영역에 존재하는 참조 변수, Method Area의 static 데이터, JNI에 의해 생성된 객체들이다.

영역

Young 영역(Yong Generation 영역)

새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 매우 많은 객체가 Young 영역에 생성되었다가 사라진다. 이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말한다. eden, survivor1, survivor2 이렇게 총 3개의 영역이 있다.

  1. 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
  2. Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동된다.
  3. Eden 영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 객체가 계속 쌓인다.
  4. 하나의 Survivor 영역이 가득 차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동한다. 그리고 가득 찬 Survivor 영역은 아무 데이터도 없는 상태로 된다.
  5. 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동하게 된다.

Old 영역(Old Generation 영역)

접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사된다. 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 이 영역에서 객체가 사라질 때 Major GC(혹은 Full GC)가 발생한다고 말한다.

참고로 Permanent Generation 영역(이하 Perm 영역)은 Method Area라고도 한다. 객체나 억류(intern)된 문자열 정보를 저장하는 곳이며, Old 영역에서 살아남은 객체가 영원히 남아 있는 곳은 절대 아니다. 이 영역에서 GC가 발생할 수도 있는데, 여기서 GC가 발생해도 Major GC의 횟수에 포함된다.

promotion

GC 종류

Serial GC (-XX:+UseSerialGC)

여러 쓰레드 중 하나의 쓰레드에서만 gc 작업이 일어나기 때문에 stw 시간이 길다. 성능이 좋지 않아서 실무에서 쓰이지 않는다.

Parallel GC (-XX:+UseParallelGC)

여러 쓰레드가 동시에 gc를 수행하기 때문에 serial에 비해 stw 시간이 짧다. young 영역에 대해서만 병렬로 수행한다. java 8 이하의 default gc이다.

코어랑 메모리가 충분하다면 효율적일 수 있다.

stw 시간이 cms나 g1gc보다 길지만 순간적인 pause가 상관 없이 application 성능만 중요하다면 이게 더 적합할 수 있다.

Parallel Old GC (-XX:+UseParallelOldGC / -XX:+ParallelGCThreads=n)

old 영역까지 멀티쓰레드로 수행한다.

CMS GC(Concurrent Mark Sweep GC)

stw를 최대한 막기 위해 reachable 객체를 한 번에 찾지 않고 네 단계를 통해 찾는다.

  1. Initial Mark: GC Root가 참조하는 객체만 마킹 (stop-the-world 발생)
  2. Concurrent Mark: 참조하는 객체를 따라가며, 지속적으로 마킹. (stop-the-world 없이 이루어짐)
  3. Remark: concurrent mark 과정에서 변경된 사항이 없는지 다시 한번 마킹하며 확정하는 과정. (stop-the-world 발생)
  4. Concurrent Sweep: 접근할 수 없는 객체를 제거하는 과정 (stop-the-world 없이 이루어짐)

image

stw 시간이 짧지만 다음의 단점이 있다. 다른 GC 방식보다 메모리와 CPU를 더 많이 사용하고 Compaction 단계가 기본적으로 제공되지 않는다. 따라서, CMS GC를 사용할 때에는 신중히 검토한 후에 사용해야 한다. 그리고 조각난 메모리가 많아 Compaction 작업을 실행하면 다른 GC 방식의 stop-the-world 시간보다 stop-the-world 시간이 더 길기 때문에 Compaction 작업이 얼마나 자주, 오랫동안 수행되는지 확인해야 한다.

java14부터 없어졌다.

G1 GC (Garbage Frist GC) (-XX:+UseG1GC)

Java 9+ 의 default GC이다. cms를 보완하기 위한 gc이며 기존의 young/old 영역에 대한 이미지와 다르다. G1 GC는 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다. 그러다가, 해당 영역이 꽉 차면 다른 영역에서 객체를 할당하고 GC를 실행한다. 즉, 지금까지 설명한 Young의 세가지 영역에서 데이터가 Old 영역으로 이동하는 단계가 사라진 GC 방식이라고 이해하면 된다. Heap을 Region이라는 일정한 부분으로 나눠서 메모리를 관리한다. 전체 Heap에 대해서 탐색하지 않고 부분적으로 Region 단위로 탐색하여, 각각의 Region에만 GC가 발생한다.

image

stw 시간이 제일 짧다.


https://d2.naver.com/helloworld/1329