Garbage Collection (GC)

전윤지·2021년 5월 27일
0

OS (운영체제)

목록 보기
3/6

1. Garbage Collection

  • C, C++ 언어는 객체를 생성 후, 프로그래머가 직접 해제 해야 함

    ⇒ JAVA에서는 JVM(자바 가상 머신)의 Garbage Collection이 자동으로 사용하지 않는 객체 해제

  • GC를 실행하기 전, stop-the-world 발생

    • stop-the-world

      : GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것

  • GC를 해도 더이상 사용 가능한 메모리 영역이 없는데 계속 메모리를 할당하려고 하면 OutOfMemoryError가 발생

    ⇒ WAS가 다운 될 위험 있음

  • JVM의 메모리 영영 중 Heap 메모리 영역만 다룸

[ GC의 대상 ]

1) 객체가 Null인 경우 (ex: String s = null)

2) 블럭 코드 실행 종료 후, 블럭 안에서 생성 된 객체

3) 부모 객체가 null인 경우, 포함하는 자식 객체들


2. Mark and Sweep

  • GC의 메모리 해제 과정
  • 이 과정에서 stop and world 가 발생

1) Marking

  • 모든 객체를 스캔하며, 사용 중인 메모리인지 아닌지 확인

    ⇒ 많은 시간을 소모함 (비효율적)

  • 참조되는 객체 : 파란색, 참조되지 않은 객체 : 주황색

2) Normal Deletion

  • 참조되지 않는 객체 제거 후 메모리 반환
  • 메모리 allocator는 반환된 블럭의 참조 위치를 저장해 두고, 새로운 객체가 선언 되면 할당 함

3) Compacting

  • 퍼포먼스를 향상시키기 위해, 참조되지 않는 객체를 제거하고 또한 남은 참조되는 객체를 묶음
  • 묶은 뒤 생기는 공간으로, 새로운 메모리 할당 시 더 쉽고 빠르게 진행 가능

3. Young, Old, Perm 영역

  • JVM의 heap 영역은 처음 설계될 때 Weak Generational Hypothesis의 두가지 전제로 설계 됨

    1) 대부분의 객체는 금방 접근 불가능 한 상태가 됨

    2) 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재 함

    ⇒ 즉, 객체는 대부분 일회성이며 메모리에 오래 남아 있는 경우는 드물다는 뜻

  • 따라서, 객체의 생존기간에 따라 heap 영역을 young, old, perm 영역으로 나눔

1) Young 영역

  • 새롭게 생성 된 객체가 할당되는 영역
  • 대부분 객체가 금방 접근 불가 상태가 되므로, 많은 객체가 young영역에 생성됐다 사라짐
  • young영역에서 객체가 사라질 때, Minor GC가 발생 했다고 함
  • eden 영역 : 새로 생성된 객체가 할당되는 영역
  • survivor 영역 : 최소 1번의 GC 후, 살아남은 객체가 존재하는 영역

2) Old 영역

  • young영역에서 접근 가능 상태를 유지하여 살아남은 객체가 복사되는 영역
  • 대부분 young영역보다 크게 할당 됨
  • old영역에서 객체가 사라질 때, Major GC가 발생 했다고 함

3) Perm 영역

  • Method Area라고도 함
  • 클래스, 메소드들을 설명하기 위한 메타 데이터를 포함

4. Minor GC, Major GC 동작 방식

  • Minor GC보다 Major GC공간이 더 크므로, major GC가 더 오랜 시간이 걸림

1) 새로 생성 된 객체 Eden 영역에 할당

2) Eden영역이 꽉차면 Minor GC 실행

2-1) Eden영역에서 사용되지 않는 객체 메모리 해제

2-2) Eden영역에서 살아남은 객체는 1개의 survivor영역으로 이동시킴

3) (1)~(2) 과정 반복

4) survivor 영역이 가득차게 되면, survivor 영역의 살아남은 객체를 다른 survivor영역으로 이동시킴

⇒ Age값 증가

이때, 한 개의 survivor 영역은 반드시 빈 상태가 됨

5) Age값이 특정 값 이상되면, 특정 age이상이 된 객체들을 old 영역으로 이동

6) (1)~(5)의 과정을 거쳐, old 영역이 가득 찰 때 major GC 발생


참고 블로그 : https://smjeon.dev/etc/jvm-gc/

https://mangkyu.tistory.com/118

0개의 댓글