JVM Garbage Collection

ymk·2023년 6월 7일
0
post-thumbnail

🗑️ Garbage Collection 이란?

프로그래머가 동적으로 할당한 메모리 영역(Heap) 중 더 이상 사용하지 않는 자원을 찾아내어 해제하는 기능이다. Java, Python 등 가비지 컬렉션을 지원하는 언어가 있으며 이러한 일을 수행하는 프로그램을 가비지 컬렉터(Garbage Collector) 라고 한다. Java에서는 JVM내에 Garbage Collector가 존재한다.


☕ Java Garbage Collection

JVM의 Runtime Data Area 중 Heap Area에 저장된 데이터는 메모리 관리가 필요한 GC 대상이다. Heap Area의 특징은 다음과 같다.

  1. Heap Area는 new 를 통하여 생성되는 객체들이 저장되는 공간이다. (배열 포함)
  2. 참조되지 않는 데이터는 GC로 인해 제거된다.
  3. 모든 쓰레드(Thread)가 공유하는 공간이다.

JVM의 Heap Area는 다음 2가지 전제로 설계되었다고 한다.

  • 대부분의 객체는 금방 접근 불가한 상태가 된다.
  • 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.

한마디로 표현하자면 객체는 대부분 일회성으로 사용되며 메모리에 오랫동안 남아있는 경우가 드물다는 것이다. 따라서 Heap Area를 더 효율적으로 사용하기 위해 3 영역으로 나누었다. Java 8 부터 Permanent Generation은 제거되었다.


🔧 동작 방식

Young 영역과 Old 영역의 메모리 구조가 서로 다르기 때문에 세부적인 동작 방식은 다르지만 가비지 컬렉터는 기본적으로 두 가지의 공통적인 단계로 실행된다.

1. Stop The World
2. Mark And Sweep

Stop The World

Stop The World는 가비지 컬렉션의 실행을 위해 GC를 실행하는 Thread를 제외한 모든 Thread를 멈추는 작업을 말한다. GC의 성능을 개선하고 싶으면 보통 Stop The World의 시간을 줄이는 작업을 해야한다.

Mark And Sweep

먼저 Stop The World를 이용하여 모든 작업을 중단시킨 후, GC는 Heap의 모든 객체를 스캔하면서 각각 어떤 객체를 참조하고 있는지 검사하고 찾아서 마킹한다. -> Mark 과정

참조하고 있지 않은 객체 즉 Unreachable 객체들을 Heap에서 제거한다. -> Sweep 과정

Sweep 후 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축한다. -> Compact 과정

🔴 Minor GC 동작 방식

Young Generation 영역은 자바 객체가 생성되자마자 저장되며, 생긴지 얼마 안된 객체가 저장되는 공간이다. Heap 영역에 객체가 생성되면 최초로 Eden 영역에 할당되는데, 이 영역에 어느정도 데이터가 쌓이게 되면 참조 정도에 따라 Servivor의 빈 공간으로 이동되거나 회수된다.
-> 이때 가비지 컬렉션을 Minor GC라고 부른다.

객체의 생존 횟수를 카운트하기 위해 Minor GC에서 객체가 살아남은 횟수를 의미하는 age를 Object Header에 기록한다. Minor GC 때 Object Header에 기록된 age를 보고 이동 여부를 결정한다.

🔴 Major GC 동작 방식

Young Generation 영역이 차게 되면 다시 참조 정도에 따라 Old 영역으로 이동되거나 회수된다. Old 영역에 할당된 메모리가 모두 차게 되면, Old 영역에 있는 모든 객체들을 검사하여 참조되지 않은 객체들을 한번에 삭제하는 GC가 실행된다.
-> 이때 가비지 컬렉션을 Major GC라고 부른다.

Young 영역은 Old 영역보다 일반적으로 크기가 작아 GC가 1초내에 끝난다. 따라서 Minor GC는 애플리케이션에 큰 영향을 주지 않는다. 하지만 Old 영역은 Young 영역보다 크며 Young 영역을 참조할 수 있기 때문에 일반적으로 Minor GC보다 Major GC가 시간이 오래걸리고 10배 이상의 시간이 소요된다.


Reference

https://hajoung56.tistory.com/43
https://d2.naver.com/helloworld/1329
https://velog.io/@cham/JAVA-GCGarbage-Collector

profile
개발 공부 일지

0개의 댓글