Java

[Java] 가비지 컬렉션 (Garbage Collection GC)

현인 2022. 8. 13. 18:16

해당 글의 내용 중 틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다!

 

 

자바를 사용하다보면 객체를 생성하기만 하지 개발자가 직접 객체의 생명주기를 관리하진 않았는데요

객체를 생성하고 소멸하는 것은 개발자가 컨트롤하지 않는데 어떻게 객체가 알아서 소멸되고 관리되는 것일까 궁금해져 알아보게 되었습니다!

 

 

가비지 컬렉션(Garbage Collection)

가비지 컬렉션이란 자바에서 객체가 할당한 Jvm Heap 영역 중 더 이상 참조되지 않는 객체들을 해제하는 작업을 의미합니다.

 

Stop the World

가비지 컬렉션이 동작할 때는 따로 스레드를 두고 동작하는 것이 아닌, 실행되고 있는 모든 스레드를 중단하고 가비지 컬렉션을 실행합니다. GC의 성능 개선을 위해 튜닝 을 한다고 하면이 중단 시간을 줄이는 것을 의미합니다.

 

Young 영역과 Old 영역

객체는 대부분 일회성이며, 메모리에 오랫동안 남아있는 경우는 드뭅니다. 그렇기에 객체의 생존 기간에 따른 물리적인 Heap 영역을 나누고, 그 영역은 각각 Young 영역과 Old 영역으로 설계되었습니다.

 

Young 영역 (Young Generationm, Minor GC)

  • 새롭게 생성된 객체가 메모리를 할당받는 영역
  • 대부분의 객체가 금방 접근 불가능 상태가 되어 많은 객체가 Young 영역에 생성되었다가 사라집니다.
  • 해당 영역에서 객체가 사라지는 것을 Minor GC가 발생한다고 말합니다.
 

 

Old 영역 (Old Generation, Full GC)

  • Young 영역에서 Reachable 상태(메모리를 할당 받은 상태)를 유지하여 살아남은 객체가 복사되는 영역입니다.
  • Young 영역보다 메모리가 크게 할당됩니다.
  • Old 영역이 Young 영역보다 많은 메모리를 할당 받는 이유는 Young 영역의 객체들은 수명이 짧아 큰 공간을 필요로 하지 않고 큰 객체들은 Young 영역이 아니라 바로 Old 영역에 할당되기 때문입니다.
  • 해당 영역에서 객체가 사라지는 것을 Major GC(Full GC)가 발생한다고 말합니다.

 

Mark and Sweep

  • Mark : 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
  • Sweep : Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업

가비지 컬렉션의 구조

  • Eden : 새로 생성된 객체가 할당되는 영역
  • Survivor : 최소 1번의 Mark에서 살아남은 객체가 존재하는 영역이 2개 존재함
  1. 객체가 생성되고 Eden 영역에 할당된다.
  2. 객체가 계속 생성되고 Eden 영역이 꽉차게 되고 Minor GC가 실행된다.
    1. Eden에서 사용되지 않는 객체의 메모리가 해제된다.
    2. Eden에서 살아남은 객체는 Survivor으로 이동된다.
  3. 1~2의 과정이 반복되다 Survivor 영역 또한 가득차게 되면 Survivor 영역의 살아남은 객체를 다른 Survivor 영역으로 이동시킨다.(1개의 Survivor 영역은 반드시 비어있는 상태입니다.)
  4. 위 과정을 반복하다 Survivor 영역 또한 가득차게 되면 객체들을 Old 영역으로 이동(Promotion)

 

Reachability

Java GC는 객체가 사용되고 있는 지를 분류하기 위해 'Reachability'란 개념을 사용한다.

 

Reachability는 객체가 유효한 참조를 하고 있을 경우 'reachable', 아닐 경우 'unreachable' 로 구별하고 unreachable 객체를 가비지로 간주해 GC를 수행합니다.

 

유효한 참조 또한 파악하기 위해 'root set' 이라는 항상 유효한 최초의 참조라는 것을 reachable의 기준으로 둡니다.

 

출처 : Naver D2

 

위에서 보듯이, root set으로부터 시작한 참조 사슬에 속한 객체들은 reachable 객체이고, 이와 무관한 객체들이 unreachable 객체로 GC 대상입니다. 오른쪽 아래 객체처럼 reacahble 객체를 참조하고 있을 지라도 본인이 참조받지 않는다면 unreachable 객체입니다.

 

물론 위의 개념은 가장 GC가 처리할 객체를 분류하는 가장 기본적인 내용이며 더 자세한 내용은 strongly reachable, softly reachable, weakly reachable, phantomly reachable를 검색해보시면 알 수 있으실 것입니다.

 

 

'Java' 카테고리의 다른 글

Test Fixture 란  (0) 2023.04.21
추상클래스 무엇이고, 왜, 어떻게 사용할까?  (0) 2023.03.24
스레드(Thread) - 개념, 동시성  (0) 2022.11.29
추상 클래스 vs 인터페이스  (0) 2022.04.12