Garbage Collection

이영재·2022년 6월 27일
0

Garbage Collection

  • Java에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에 가비지 컬렉터(Garbage Collector)가 더 이상 필요 없는 (쓰레기) 객체를 찾아 지우는 작업(Garbage Collection)을 한다.
  • 가비지 컬렉터는 두 가지 가설(전제 조건) 하에 만들어졌다. (weak generational hypothesis)
    • 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다.
    • 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.

Garbage Collection 동작 시점

  • GC도 결국엔 JVM에 올라가기 때문에 기본적으로 런타임에 동작한다.
  • 가비지 컬렉션 작업을 위한 몇 가지 조건이 있는데, 다음 조건 중 하나라도 충족되면 JVM은 GC를 실행한다.
    1. OS로부터 할당 받은 시스템의 메모리가 부족한 경우
    2. 관리하고 있는 힙에서 사용되는 메모리가 허용된 임계값을 초과하는 경우
    3. 프로그래머가 직접 GC를 실행하는 경우 (가급적 안 쓰는 것이 좋다.)

Garbage Collection 실행 단계

Young 영역과 Old 영역은 서로 다른 메모리 구조로 되어 있기 때문에, 세부적인 동작 방식은 다르지만 기본적으로 가비지 컬렉션이 실행된다고 하면 다음의 2가지 공통적인 단계를 따르게 된다.

  1. Stop The World
  2. Mark and Sweep

1. Stop The World

  • Stop The World는 가비지 컬렉션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업이다.
    • GC가 실행될 때는 GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업이 중단되고, GC가 완료되면 작업이 재개된다.
    • 당연히 모든 쓰레드들의 작업이 중단되면 애플리케이션이 멈추기 때문에, GC의 성능 개선을 위해 튜닝을 한다고 하면 보통 stop-the-world의 시간을 줄이는 작업을 하는 것이다.
    • 또한 JVM에서도 이러한 문제를 해결하기 위해 다양한 실행 옵션을 제공하고 있다.

2. Mark and Sweep

  • Mark: 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
  • Sweep: Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업
    • Stop The World를 통해 모든 작업을 중단시키면, GC는 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각이 어떤 객체를 참고하고 있는지를 탐색하게 된다. 그리고 사용되고 있는 메모리를 식별하는데, 이러한 과정을 Mark라고 한다. 이후에 Mark가 되지 않은 객체들을 메모리에서 제거하는데, 이러한 과정을 Sweep라고 한다.





[참고]
https://d2.naver.com/helloworld/1329
https://readystory.tistory.com/48
https://mangkyu.tistory.com/118?category=872426

profile
왜why를 생각하는 두괄롬이 되자!

0개의 댓글