기술면접 관련 및 참고하기

GC (Garbage Collection)이란 무엇인가?

지팡구 2023. 3. 31. 04:14

과거에도 GC가 무엇인지 간단하게 알고 있었다. Java에서는 C언어와 다르게 메모리를 자동으로 관리해주는 것이 있는데, 이것이 GC이다. 면접을 위해서 GC를 이해하고 정리하고자 합니다.

 

1. GC란?

GC는 (Garbage Collection, GC)의 약어로 메모리를 관리하는 하나의 기법입니다. JVM (Java Virtual Machine, JVM)의 Heap 영역에서 연결이 끊어진 객체를 제거하는 역할을 합니다. 이로써 개발자는 메모리를 관리하지 않고 오로지 기능구현에만 신경쓸 수 있는 장점이 있습니다.

 

그러나 GC가 자동으로 메모리를 관리해주지만, 언제 해제되는지 몰라서 정확하게 시점이 파악이 어렵습니다. 때문에 실시간 서비스에서 만약에 갑자기 GC가 동작하면 GC를 담당하고있는 스레드를 제외한 다른 스레드들은 동작이 멈춥니다. 그래서 실시간 서비스에서는 GC를 지양해야 합니다.

 

GC는 heap 영역에서 동작한다고 앞서 설명했습니다. 이 Heap역역은 다시 Young 영역과 Old 영역으로 나뉘는데,  이 때 Young 영역에서는 Minor GC가 동작하고, Old 영역에서는 Major GC가 동작하게 됩니다.

 

이렇게 heap 영역에서도 두 영역으로 나뉘는 이유는 객체의 수명과 관련이 있습니다. 상대적으로 크기가 큰 객체들은 수명이 길어 큰 공간을 필요로 합니다. 그러나 수명이 짧은 객체들은 큰 공간을 필요로 하지 않아서 Young 영역에 할당됩니다.  그래서 대부분의 객체가 금방 생성되었다 사라지기에 대부분 Young 영역에 할당됩니다. 

 

2. GC의 동작 방식 

Heap의 Young 영역과 Old 영역은 다른 메모리 구조를 가지고 있어, 세부적인 동작 방식이 다릅니다. 그러나 기본적으로 GC까 실행되면 2가지 공통사항이 있습니다.

 

  • Stop The World
    • GC가 동작하면 해당 스레드를 제외하고 다른 스레드는 실행을 멈춥니다. 그리고 GC가 완료되면 다시 재개되는데, 이것을 Stop The World라고 합니다. 그래서 일반적으로 GC 성능 개선을 위해 튜닝을 한다고 하면 Stop The World를 줄이는 작업을 말하는 것입니다.
  • Mark and Sweep ( 알고리즘임 )
    • 여기서 Mark는 사용되는 메모리와 그렇지 않은 메모리를 확인하는 작업이고, Sweep은 Mark 단계에서 사용되지 않는 메모리를 해제하는 작업입니다.

앞서 설명한 것처럼 Young 영역에는 Minor GC가, Old 영역엔 Major GC가 동작한다고 언급했습니다.

 

1. Young 영역의 Minor GC는 어떻게 동작하나요?

 

0. 이 Young 영역은 다시 3개의 영역으로 나뉘게 됩니다 ( Eden / Survivor1 / Survivor2)

1. 객체가 생성되면 Eden 영역에 할당됩니다.

(해당 (Eden) 영역에 객체가 가득차면 영역 속 객체는 옮겨지거나 삭제되어야 합니다. ) 

 

2. Eden 영역이 가득차면 Minor GC가 동작합니다. 

(사용되지 않는 메모리는 해체되고, 살아남은 즉 사용되는 객체는 Survivor 영역 중 한 곳에 들어갑니다(이 때, 다른 한 곳은 계속 비어있어야 함.))

 

3. 1번과 2번의 과정이 반복되고 Survivor 영역이 가득차면 살아남은 객체를 다른 Survivor 영역으로 이동시킵니다.

 

4. 이러한 과정을 반복해서 계속 살아남은 객체는 Old 영역으로 이동하게 됩니다.

 

추가로

객체의 생존 횟수를 카운트하기 위해 Minor GC에서 객체가 살아남은 횟수를 의미하는 age를 Object Header에 기록합니다.  Minor GC는 이 Object Header에 기록된 age를 보고 Old 영역으로의 이동을 결정합니다 

 

2. Old 영역의 Major GC 는 어떻게 동작하나요?

앞서 Young 영역에서 살아남은 객체들이 계속해서 Old 영역에 쌓일 것이고, 이 영역이 가득차면 이 때 Major GC가 동작합니다. 일반적으로 Old 영역이 Young 영역보다 크기가 작습니다. 그래서 Young 영역에서 GC는 보통 1초 미만으로 동작해서 애플리케이션에 큰 영향을 미치지 않지만 Old 영역은 그렇지 않기에 많은 시간을 사용합니다.

 

3. GC의 다양한 알고리즘

대표적으로 내가 사용한 Java 8 버전의 Parell GC와  Java 9버전부터 지원하는 GC인 G1 GC를 설명해보고자 한다.

 

Java 8 이전의 기본 GC는 Serial GC입니다. 이 GC의 가장 큰 특징은 서버의 CPU 코어가 1개일 때 사용하기 위해 개발되었다는 점입니다. 그러나 자바 8저번으로 올라오면서 기본 GC가 Parell GC로 바뀌게 됩니다. 

기본적인 처리 과정은 이전 default GC와 같지만 Parell GC는 여러 쓰레드를 통해 병렬하게(Parallel) GC를 수행해서 오버헤드를 줄입니다. 그러나 여전히 Application이 멈추는 것을 해결할 수 없었습니다.

 

그래서 Java 9 버전에서는 Default GC를 G1 GC로 지원하게 됩니다. 이 G1 GC는 Java 7부터 지원했지만 기본 GC로 제공하진 않았습니다. 이 G1 GC의 가장 큰 특징은 동적으로 heap 영역을 할당하는 것입니다. 일반적으로 heap 영역의 Young 영역과 Old 영역을 정적으로 사용했지만 G1 GC에서는 이 영역을 Region이라는 개념을 도입해서 동적으로 사용하게 됩니다. 이로 인해 가비지가 많은 Region에 대해 우선적으로 GC를 수행해서 가득찬 영역을 빠르게 회수할 수 있으며, 빈공간의 확보에 유리합니다. 

 

4. GC 튜닝

개발자는 이 Heap 영역을 핸들링 할 수있는데 이를 GC 튜닝이라고 합니다. 그러나 왠만해선 GC 튜닝을 하지 않는게 좋습니다. 잘못된 정보를 가지고 GC를 튜닝하게 되면 GC가 길어지게되는데, 이말은 Stop The World가 길어짐을 의미합니다. 그래서 Application이 죽는 시간이 길어질 것입니다.

 

 

참고 레퍼런스

 

[Java] Garbage Collection(가비지 컬렉션)의 개념 및 동작 원리 (1/2)

1. Garbage Collection(가비지 컬렉션)이란? [ Garbage Collection(가비지 컬렉션)이란? ] 프로그램을 개발 하다 보면 유효하지 않은 메모리인 가바지(Garbage)가 발생하게 된다. C언어를 이용하면 free()라는 함

mangkyu.tistory.com

 

[Java] 가비지 컬렉션 GC(Garbage Collection)의 동작원리와 동작하는 시점

Garbage Collection(가비지 컬렉션)이란? 메모리 관리 기법 중 하나로 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능. 즉, 동적 할당된 메모리 영역 가운데 어

itkjspo56.tistory.com