# CS

GC. Garbage Collection

jiniz.ll 2021. 6. 23. 22:38

KEYWORD

  • 메모리 관리 방법

Garbage Collection 이란?

 

메모리 관리 방법 중 하나로, 

시스템에서 더 이상 사용하지 않는 동적 할당된 메모리 블럭을 찾아 다시 사용 가능한 자원으로 회수하는 것으로

시스템에서 가비지 컬렉션을 수행하는 부분을 Garbage Collector 라고 부름

 

GC 기능을 채택한 언어의 경우 

프로그래머가 프로그램 코드로 메모리를 명시적으로 해제하지 않음

메모리 할당과 해제가 자동으로 실행되며 프로그램 실행 과정에서 쓸모없어진 메모리들을 알아서 수집하고 관리해 줌

 

예시.

String[] array = new String[2];

array[0] = '0';
array[1] = '1';

array = new String[] {'G', 'C' };

 

새로운 스트링 배열이 할당되기 전 0과 1은 어디로 갔을까?

이렇게 주소를 잃어버려 사용할 수 없는 메모리가 ‘정리되지 않은 메모리’ 이며

프로그래밍 언어에서는 Dangling Object, 자바에서는 Garbage 라고 함

[출처. 가비지 컬렉터(GC)에 대하]

 

Garbage Collector 의 원리

가비지 컬렉터가 하는 일

  1. 메모리 할당
  2. 사용 중인 메모리 인식
  3. 사용하지 않는 메모리 인식

 

즉, 메모리가 부족할 때 쓰레기를 정리해주는 프로그램

JVM은 메모리를 부여받고 프로그램을 실행하다가 메모리가 부족해지는 순간이 오면 추가적으로 메모리를 더 요청하는데 이 때 가비지 컬렉터가 실행됨

 

GC 의 2가지 가정

  • 대부분의 객체는 금방 접근 불가능 상태 (unreachable)가 됨
  • 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재함

 

weak generational hypothesis

 

Stop the world

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

 

  • Stop-the-world 가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춤
  • GC 작업을 완료한 이후에 중단했던 작업을 다시 시작

 

어떤 GC 알고리즘을 사용하더라도 stop-the-world 는 발생하며

대게의 경우 GC 튜닝이란 이 과정의 시간을 줄이는 것을 의미함

 

Mark and Sweep

: GC 과정을 mark and sweep 이라 부름

 

  • 가비지 컬렉터가 모든 변수나 객체들을 스캔하면서 어떤 객체를 가리키고 있는지 찾는 과정을 Mark

이 과정에서 Stop the world 가 발생

  • 이 후 Mark 되어 있지 않은 객체들을 힙에서 제거하는 과정이 Sweep

 

어떤 원리로 소멸시킬 대상을 선정하는가?

알고리즘에 따라 동작 방식은 다양하지만 공통적인 원리가 있음

Garbage Collector 는 힙 내의 객체 중에 Garbage를 찾아내고 찾아낸 Garbage를 처리하여 힙의 메모리를 회수함

 

Garbage : 참조되고 있지 않은 객체

Rechability — 해당 객체가 유효한 참조가 있음

Unreachability — 해당 객체가 유효한 참조가 없음

 

하나의 객체가 다른 객체를 참조하고, 다른 객체는 또 다른 객체를 참조할 수 있음

참조 사슬 형성

이 중 최초에 참조한 것을 Root Set 이라 함

 

 

[출처. #가비지컬렉션(Garbage Collection) / JVM 구동원리에 이어]

 

 

참조를 하는 4가지 경우

  1. 힙 내의 다른 객체에 의한 참조
  2. Java 스택, 즉 Java 메서드 실행 시에 사용하는 지역변수와 파라미터들에 의한 참조
  3. 네이티브 스택(JNI, Java Native Interface) 에 의해 생성된 객체에 대한 참조
  4. 메서드 영역의 정적 변수에 의한 참조

2, 3, 4 는 Root Set

 

인스턴스가 가비지 컬렉션의 대상이 되었다고 바로 소멸되는 것은 아님

빈번한 GC의 실행은 시스템에 부담이 됨

성능에 영향을 미치지 않도록 GC 실행 타이밍은 별도의 알고리즘을 기반으로 계산되며, 이 계산 결과를 기반으로 GC가 수행됨

 

GC 영역의 구성

[출처. GC 동작원리 - wooody92’s blog]

 

 

JVM의 메모리는 크게 클래스 영역, 자바 스택, 힙, 네이티브 메소드 스택 이렇게 4개 영역으로 나뉘는데

GC에서는 힙 메모리를 다루게 됨

이 Heap 은 Young, Old, Perm 으로 나뉘게 되는데, Young 영역에서 발생한 GC 를 Minor GC, 나머지 두 영역에서 발생한 GC를 Major GC(또는 Full GC) 라고 함

 

Young 영역

: 새롭게 생성한 객체의 대부분이 여기에 위치

: 대부분의 객체가 금방 접근 불가능 상태가 되므로 많은 객체가 Young 영역에 생성되었다가 사라짐

: 이 영역에서 객체가 사라질 때 Minor GC 가 발생한다고 말함

 

Young 영역의 구성: 총 3개의 영역으로 나뉨

  • Eden 영역
  • Survivor 영역(2개)

 

Old 영역

: 접근 불가능 상태로 되지 않아 Young 영역에서 살아남은 객체가 여기로 복사됨

: 대부분 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생함

: 이 영역에서 객체가 사라질 때 Major GC(또는 Full GC)가 발생한다고 말함

 

그렇다면

“Old 영역에 있는 객체가 Young 영역의 객체를 참조하는 경우가 있는 경우는 어떻게 처리될까?”

이러한 경우를 처리하기 위해 Old 영역에 512 바이트 덩어리(chunk)로 되어 있는 카드 테이블(card table)이 존재함

 

카드 테이블에는 Old 영역에 있는 객체가 Young 영역의 객체를 참조할 때마다 정보가 표시됨

Young 영역의 GC 를 실행할 때에는 Old 영역에 있는 모든 객체의 참조를 확인하지 않고, 이 카드 테이블만 뒤져서 GC 대상인지 식별함

[출처. NAVER D2 — Java Garbage Collection]

 

카드 테이블은 write barrier 를 사용하여 관리함

Write barrier 는 Minor GC를 빠르게 할 수 있도록 하는 장치임

Write barrier 때문에 약간의 오버헤드는 발생하나 전반적인 GC 시간은 줄어듬

 

Perm 영역

: Permanent Generation 영역(Perm 영역)은 Method Area 라고도 함

; 객체나 억류(intern)된 문자열 정보를 저장하는 곳이며

; Old 영역에서 살아남는 객체가 영원히 남아 있는 곳이 절대 아님

[출처. NAVER D2 — Java Garbage Collection]

; 이 영역도 GC가 발생할 수 있는데, 여기서 GC가 발생해도 Major GC의 횟수에 포함됨

 

 

GC 과정

Minor GC

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

Survivor 영역 중 하나는 반드시 비어 있는 상태로 남아있어야 함

만약 두 Survivor 영역에 모두 데이터가 존재하거나, 두 영역 모두 사용량이 0이라면 이 시스템은 정상적인 상황이 아님

 

Major GC

Old 영역에 있는 모든 객체들을 검사하여 참조되지 않은 객체들을 한꺼번에 삭제함

시간이 오래 걸리고 실행 중 프로세스가 정지됨

stop-the-world

 

Old 영역은 기본적으로 데이터가 가득 차면 GC를 실행함

 

GC 방식은 5가지가 있음

  • Serial GC
  • Parallel GC
  • Parallel Old GC(Parallel Compacting GC)
  • Concurrent Mark & Sweep GC (CMS)
  • G1(Garbage First) GC

 

한계점

  • 어떤 방식의 GC 을 사용하더라도 실행 시간에 작업을 하는 이상 성능 하락이 반드시 생김
  • GC 를 하더라도 더 이상 접근 불가능한 객체만 회수하므로 메모리 누수는 발생할 수 있음

 

REFERENCE

가비지 컬렉션, 컬렉터(Garbage Collection)란?

GC 동작원리 - wooody92’s blog

NAVER D2 — Java Garbage Collection

#가비지컬렉션(Garbage Collection) / JVM 구동원리에 이어

가비지 컬렉터(GC)에 대하

 

추가로 읽기 좋은 글

NAVER D2 — Java Reference와 GC

성능튜닝 가비지 컬렉터(GC) 이해하

C# 가비지 컬렉터 (Garbage Collector) 원리, 동작 메커니즘 :: IT’s me

다 쓴 메모리를 자동으로 수거해주는 가바지컬렉터(Garbage Collector:GC), 기본 원리 파해치기 :: Kamang’s IT Blog

Java에서의 가비지컬렉터(Garbage Collector:GC)돌아가는 원리 파해치기 :: Kamang’s IT Blog

Java Garbage Collection(가비지 컬렉션)의 개념 및 동작 원리 (1/2) - MangKyu’s Diary

가비지 컬렉터(Garbage Collector)와 Mark & Sweep :: 삐멜 소프트웨어 엔지니