본문 바로가기
IT Study/YouTube 영상 후기

10분 테코톡 - JVM의 Garbage Collector

by hhyyyjun 2022. 12. 23.

https://www.youtube.com/watch?v=vZRmCbl871I

| JVM

Java Virtual Machine

운영체제의 메모리 영역에 접근하여 메모리를 관리하는 프로그램

메모리 관리 Garbage Collector

| Garbage Collector

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

| Stack, Heap

Stack

정적으로 할당한 메모리 영역

원시 타입의 데이터가 값과 함께 할당, Heap영역에 생성된 Object 타입의 데이터의 참조 값 할당

Heap

동적으로 할당한 메모리 영역

모든 Object 타입의 데이터가 할당, Heap영역의 Object를 가리키는 참조 변수가 Stack에 할당

ex)

public class Exam01{
  public static void main(String[] args){
    int a = 5;
    int b = 20;
    int sum = a + b;
    double pi = 3.14;
    String str = "시험";

    System.out.println(sum);
    System.out.println(str);
  }
}

이와 같은 코드에서 각 데이터 값이 Stack에 저장

main 메서드가 종료 시 Stack 영역의 데이터는 날아가고 Heap의 객체 데이터만 남아있는데 이를 Reachable Object라고 한다.

| Garbage Collecor 과정(Mark and Sweep)

Mark

1) Garbage Collector가 Stack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹

2) Reachable Object가 참조하고 있는 객체도 찾아서 마킹

Sweep

3) 마킹되지 않은 객체를 Heap에서 제거함(Sweep)

| Heap

New Generation 영역

1) Eden 영역

Heap영역에서 Eden영역에 새로운 객체 할당

에덴 영역이 메모리가 사용이 되었으면 가비지 콜렉터(GC 발생(Minor))가 일어남

Eden영역에 객체가 다 할당 되었을 때 Mark and Sweep 과정이 일어나고 살아남은 객체는 survival 영역으로 옮겨짐.

에덴 영역의 unreachable객체는 메모리에서 해제

과정 반복 >>

2) Survival 0 영역

survival영역이 객체가 다 옮겨져 꽉 차게 되면 survival 0 영역에 대해 Mark and Sweep 과정이 일어남

survival 0에서 살아남은 객체는 survival 1로 이동, 이동한 객체는 Age값 증가

과정 반복 >>

3) Survival 1 영역

survival 0 영역에 있던 객체는 survival 1영역으로 옮겨지며

eden영역의 unreachable 객체는 메모리에서 해제

Age 값이 특정 값 이상이 되면 Old Generation 영역으로 옮겨짐 = promotion 과정

Old Generation 영역

Old Generation 영역이 가득차면 GC 실행 (Major)

> New Generation에서 Old Generation 영역에 대한 과정이 반복되면서 Garbage Collector가 메모리를 관리

| Garbage Collector 종류

1. Serial GC

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

CPU 코어가 1개만 있을 때 사용하는 방식

Mark-Compact collection 알고리즘 사용

2. Parallel GC

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

Serial GC보다 빠르게 객체를 처리할 수 있음

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

3. Concurrent Mark Sweep GC(CMS GC)

Stop The World를 줄임으로써 속도/응답이 중요한 애플리케이션에 사용하도록 한 GC

Stop The World 시간이 짧음.

애플리케이션의 응답 시간이 빨라야 할 때 CMS GC를 사용

다른 GC 방식보다 메모리와 CPU를 더 많이 사용

Compaction 단계가 제공되지 않음

*Stop-The-World

GC을 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것

Stop The World가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춤

GC작업을 완료한 이후에 중단한 작업을 다시 시작

4. G1 GC

각 영역을 Region 영역으로 나눔

GC가 일어날 때, 전체영역(Eden, Survival, Old Generation)을 탐색하지 않는다.

G1 GC는 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다.

해당 영역이 꽉 차면 다른 빈 영역에 객체를 할당하고 GC를 실행한다.

G1 GC는 다른 STW 시간이 짧다

Compaction을 사용한다.

댓글