7장 Garbage Collection

ys0820.kim·2022년 10월 27일
0

Garbage Collection

불필요한 데이터의 할당을 해제하고 메모리를 정리하는 것.
-> 메모리 누수 방지

C언어의 경우 free() 함수로 동적 할당된 메모리를 개발자가 직접 해제해야 하지만 Java의 경우 JVM(java virtual machine)의 Garbage Collector가 메모리를 자동으로 정리해준다.

ex.

Person person = new Person();
person.setName("Mang");
person = null;

// 가비지 발생
person = new Person();
person.setName("MangKyu");

Heap 메모리 구조

자바의 Heap 메모리의 특성 : 객체는 대부분 일회성이며, 메모리에 오랫동안 남아있는 경우는 드물다

-> 객체의 생존 기간에 따라 Young Generation, Old Generation으로 구분하고 이에 따라 GC를 실행한다.

  • Young Generation
  1. 새로 생성된 객체가 할당
  2. Young 영역에 대한 GC = Minor GC
  • Old Generation
  1. Young 영역에서 오래 살아남은 객체들이 복사되어 저장됨.
  2. 저장 사이즈 : Old > Young
  3. Old 영역에 대한 GC = Major GC or Full GC

GC 동작 원리

- Stop The World

GC를 실행하기 전, JVM이 Application의 실행을 모두 멈춤

- Mark and Sweep

  • Mark : 참조가 있는 객체들을 표시
  • Sweep : 참조가 없는 객체들을 제거
  • Compact : 분산된 데이터들을 시작 주소부터 연속적이게 재배치

GC 동작 과정

  1. 객체가 생성되면 제일 처음 Eden 영역에 생성.
    age-bit를 이용하여 객체가 얼마나 오랫동안 머무는지 알 수 있다. Minor GC에서 생존할 때마다 +1
  1. Eden 영역이 꽉차면 Minor GC가 발생하고 살아남으면 Survival 0 또는 1영역으로 이동시킨다. (Survival 영역 중 한곳은 항상 비어있다.)
  1. 1, 2를 반복하다가 Survival 영역이 가득차면 Minor GC 실행 후, 살아남은 객체는 빈 Survival 영역에 이동시킨다.
  1. 1~3 과정을 반복하다가 age bit가 특정 숫자 이상으로 커지면 오랫동안 지울 필요가 없는 데이터로 간주하고 Old 영역으로 이동시킨다. (= Promotion)
  1. Old 영역에서 일정 수준 이상으로 메모리가 차면
    Old 영역을 Major GC한다.
    • Minor GC는 비교적 짧게 걸리지만, Old 영역의 크기가 크기 때문에 Major GC는 오래걸린다. -> 너무 잦으면 성능 저하 야기

출처1
출처2

0개의 댓글