∞. 기술 면접/7. 자바

07. 기술면접 - 자바 - 가비지 컬렉션(Garbage Collection ) 처리 방법

THE HEYDAZE 2021. 10. 21. 10:36
공부목적으로 다른 블로그의 글을 그대로 따라치면서 작성되었습니다. 저작권 문제 시, 비공개 처리하겠습니다

JAVA 의 Garbage Collection 처리 방법

- GC(Garbage Collection) 을 수행하는 가비지 컬렉터(Garbage Collector) 가 하는 일
  1. 메모리 할 당
  2. 사용 중이 메모리 인식
  3. 미사용 메모리 인식

- Stop the World
  1. 자바 애플리케이션은 GC 실행 시 GC 실행 스레드를 제외한 모든 스레드를 멈추고, GC 완료 후 다시 스레드를 실행
     상태로 변경 (아래 코드 참고)
  2. Stop the World 는 모든 애플리케이션 스레드의 작업이 멈추는 상태
  3. 어떤 GC 알고리즘을 사용하더라도, Stop the world 불가피하며 최소화하기 위해 GC 튜닝을 진행

public  class GCTest {

    public static void main(String[] args) {

        System.gc();
    }
}

 

- 가비지 컬렉터(Garbage Collector)가 들르는영역은 Young 영역에 포함되는 Eden, Survivor , Survivor2 와 Old 영역
 > Permanent 영역은 JAVA 1.8 부터제거 되었다 -> 크기가 강제되던 영역이였는 데, 이 때문에 메모리 영역이 제한적임
 > Perm 영역 대신 Metaspace 영역이 추가되었고, Metaspace 는 Native Memory 영역으로 OS가 자동으로 크기 조절함
 > 그 결과로 이전보다 큰 메모리 영역을 사용할 수 있게 되었다
 > 참고 : https://johngrib.github.io/wiki/java8-why-permgen-removed/

- Young 영역에 있는 객체는 각 하위 영역이 가득 차면 Miner GC 가 동작하여 더 이상 참조되지 않는 객체 제거
- Old 영역에 있는 객체는 영역이 가득 차면 Major GC(Full GC)가 동작하여 더 이상 참조되지 않는 객체 제거
- 동작과정
  1. 객체를 최초 생성 시, Young 영역 중 Eden 영역에 위치
  2. Eden 영역에서 Miner GC 발생 시, 참조 중인 객체라면 Survivor 1로 이동
  3. Survivor1 에서 Miner GC 발생 시, 참조 중인 객체라면 Survivor 2로 이동
  4. Survivor2 에서 Miner GC 발생 시, 참조 중인 객체라면 다시 Survivor 1 영역으로 이동 (Survivor 1 <-> 2 반복 이동)
  5. Surivor 영역이 가득차거나 Young 영역에서 오래 살아남은 객체는 Old 영역으로 이동
      ㄴ 오래기준은 객체마다 age bit 라는 것을 가지고 있는 데 이는 Miner GC 에서 살아남은 횟수를 기록하는 값
  6. Old 영역에 있는 객체가 Major GC 가 발생했을 때, 참조여부에 따라 공간이 유지되거나 제거