Garbage Collector

calis_ws·2024년 1월 16일
0
post-thumbnail

GC

자바의 메모리 관리 기법으로 어플리케이션이 동적으로 할당했던 메모리 영역 중 더이상 사용하지 않는 영역을 정리하는 기능이다.

앞으로 사용되지 않는 객체의 메모리를 Garbage 라고 부르고, 이를 정해진 스케줄에 의해 정리해준다.

Heap 메모리에서 활동하며, JVM 에서 GC 의 스케줄링을 담당한다. 개발자가 직접 관여하지 않아도 자동으로 메모리를 관리한다.

GC 의 원리

'약한 세대 가설' 덕분에 GC 가 가능했다.
아래 가정을 기반으로 메모리 구조를 크게 2개로 물리적 공간을 나눔
(Young Generation, Old Generation)

1. 대부분의 객체는 금방 접근 불가능(Unreachable) 한 상태가 된다.

- 대부분의 객체는 중괄호 안에서 생성
- 이 객체들은 괄호가 끝나는 시점에서 더이상 사용되지 않음
- 특수한 경우에는 오래 사용할 수 있지만, 대부분의 경우 unreachable 한 상태가 되어 GC의 대상이 됨
2. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 발생

- 일반적으로 순차적인 로직에 의해 객체를 생성하여 활용
- 이 과정에서 앞에 생성된 객체는 그 다음의 로직에서 사용된 이후 대부분 사용되지 않게 됨
- 이런 특성으로 인해 더이상 참조되지 않는 객체에 대해 GC 를 할 수 있게 됨

GC 작동 순서

Mark and Sweep

Mark : 가비지 컬렉터가 사용중인 객체(reachable)와 사용되지 않는 객체(unreachable)를 식별한다.
Sweep : Mark 단계에서 식별된 사용되지 않는 객체를 수거한다.

Compaction

메모리 공간에서 사용하지 않는 빈 공간이 없도록 옮겨서 메모리 분산을 제거하는 작업이다.
살아남은 객체들을 연속된 영역으로 배열한다. 이 과정은 메모리 단편화를 방지한다.

Heap Area

GC 과정

  1. 맨 처음 객체가 생성되면 Eden 영역에 생성

  2. Minor GC 가 발생하면 미사용 객체의 제거와 함께 아직 사용되고 있는 객체는 Survivor1, Survivor2 영역으로 이동 시킴 (객체의 크기가 S 영역보다 크면 Old 로 이동)

  3. 운영 특성상, S1 과 S2 영역은 둘 중 한 곳에만 객체가 존재하게끔 운영되며, 다른 한 곳은 비어져 있어야 함.
    보통 From, To 로 구분을 하며, 객체가 존재하는 S 영역(From)이 가득 차면 다른 S 영역(To)로 보내고 기존의 S 영역(From)을 비우는 작업을 진행

  4. 위 과정(1 ~ 3)을 반복하면서 S 영역에서 살아남은 객체들에게 일정 score 가 누적이 되어 기준치 이상이 되면 Old 영역으로 이동하게 됨 (Promotion)

  5. Old 영역에서 살아남았던 객체들이 일정 수준 쌓이게 되면, 미사용으로 판단된 객체들을 제거해주는 Full GC 가 발생. 이 과정에서 STW 가 발생하게 됨

Stop The World

GC 를 수행하기 위해 JVM 이 멈추는 현상을 의미한다.

GC 가 작동하는 동안 GC 관련 쓰레드를 제외한 모든 쓰레드는 멈춘다.
일반적으로 '튜닝'은 이 시간을 최소화하는 것을 의미한다.

종류

Serial GC

  • 하나의 쓰레드로 GC 를 실행

  • Stop The World 시간이 길다

  • 싱글 쓰레드 환경 및 Heap 이 매우 작을 때 사용하기 위해 나온 방식

Parallel GC

  • 여러 개의 쓰레드로 GC 를 실행

  • Serial GC 보다 Stop The World 시간이 짧다

  • 멀티코어 환경에서 사용한다

  • Java 8 의 default GC 방식이다

CMS(Concurrent Mark-Sweep) GC

  • Stop The World 시간을 최소화하기 위해 고안됨

  • GC 작업을 어플리케이션과 동시에 실행해서 ~.. 시간 최소화

  • 메모리와 CPU를 많이 사용하고, Compaction 이 기본적으로 제공되지 않는다. (단점)

  • G1 GC 등장에 따라 Deprecated

G1(Garbage First) GC

  • 큰 메모리에서 사용하기 적합한 GC

  • Heap 을 일정 크기의 Region 으로 잘게 나누어 사용

  • 가비지만 있는 Region 부터 수거해간다 (G1)

  • 런타임에 필요에 따라 영역별 Region 개수를 튜닝해서 Stop The World 를 최소화

  • Java 9 부터 default GC 방식이다


출처

자바의 메모리 관리 방법! 가비지 컬렉션 (Garbage Collection) [ 자바 기초 강의 ]
https://youtu.be/jXF4qbZQnBc?si=CEWd5_id19K_zkM2

[10분 테코톡] 🤔 조엘의 GC
https://youtu.be/FMUpVA0Vvjw?si=83Y1yMwoE5EixbpR

[10분 테코톡] 🐥엘리의 GC
https://youtu.be/Fe3TVCEJhzo?si=BsXXy6b3K5eSoIfa

[개발자 면접 질문] 자바 - 가비지 컬렉션
https://youtu.be/9so187f-YRM?si=Nw0v2QBrMkxjqCuu

profile
반갑습니다람지

0개의 댓글