22.04.06 JVM의 GC

Seunghan·2022년 4월 6일
0

Java

목록 보기
3/6

Garbage Collection

동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능

GC 알고리즘

Reference Counting

객체들은 Heap 영역에 생성되는데 객체들이 각각 Reference Count라는 별도의 숫자를 가지고 있다. Reference count가 0이 될 경우 제거하는 방식

  • reference count : 몇가지 방법으로 객체에 접근할 수 있는가

문제점

Root Space에서 접근할 수 없으나 내부 순환참조(서로가 서로를 참조)가 있어 reference count가 0이 되지 않을때 → 사용하지 않는 메모리 영역이 해제되지 못하고 메모리 누수가 발생함

Mark & Sweap

Garbage Collector가 Stack의 모든 변수를 스캔(DFS)하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다. (Mark) 그 후 마킹되지 않은 객체를 Heap에서 제거한다. (Sweap)

  • 참조되고 있는 객체 : Reachable
  • 참조되고 있지 않은 객체 : UnReachable

메모리 파편화를 방지하기 위해 Compaction을 실시할 수 있는데 Mark & Sweep에서는 필수가 아니다.

Mark & Sweap 방식의 특징(중요!)

  • Garbage Collector를 실행시키는 시점을 지정해 줘야한다.
  • 어플리케이션과 Garbage Collecton이 동시에 병행된다.

JVM의 Root Space는 어디인가?

  • Stack의 로컬 변수
  • Method 영역에 저장된 static 변수
  • Native Method stack의 C/C++로 작성된 JNI 참조

Heap 영역

Young Generation

Eden

새롭게 생성된 객체들이 할당되는 영역. Eden의 영역이 다 차게되면 Minor GC가 발생하고 Survival 영역에 번갈아가면서 살아남은(Reachable) 객체를 이동시킨다.

Survival 0, Survival 1

Survival 0 혹은 1 둘 중 하나는 무조건 비어있어야 한다.
Eden에서 Survival로, Survival에서 Survival로 영역이 다 차서 Minor GC가 발생하여 살아남은 객체가 이동할 떄는 age bit값이 1씩 증가하게 된다.

Old Generation

JVM GC에서는 일정 수준의 age-bit를 넘어가면 해당 객체를 Old Generation으로 이동시킨다.(Promotion)

Java 8에서는 Parallel GC 방식 기준 age-bit가 15가 되면 promotion 발생

Old Generation 영역이 다 차는 순간 Major GC 발생, Mark & Sweap이 진행되고 필요 없는 메모리를 비운다.

GC 실행 방식

Stop The World : GC를 실행하기 위해 JVM이 어플리케이션 실행을 멈추는 것

  • Serial GC - stop the world 시간이 길다.

GC를 처리하는 스레드가 1개이다.

CPU 코어가 1개만 있을 때, Heap이 매우 작을 때 사용하는 방식

Mark-Compact collection 알고리즘 사용

  • Parallel GC - Java 8의 default GC 방식

GC를 처리하는 스레드가 여러개이다.

Parallel GC는 메모리가 충분하고 코어의 개수가 많을 때 사용하면 좋다.

  • Concurrent Mark Sweep GC - G1 GC가 증장하고 Deprecated

GC작업을 어플리케이션 스레드와 동시에 실행 - stop the world시간을 최소화

메모리를 많이 사용하고 Mark & Sweap 작업 이후 Compaction이 기본적으로 제공되지 않는다.

  • G1(Garbage First) GC - Java 9 이상 default GC 방식

Heap을 일정 영역의 Region으로 나누어 일부는 Young Generation으로 나머지는 Old Generation으로 사용

Runtime에 G1 GC개 영역별 Region 개수 튜닝

Reference

조엘의 GC

profile
주니어 백엔드 개발자입니다!

0개의 댓글

관련 채용 정보