[Java] GC (Garbage Collection)

Updated:

Garbage : 프로그램에서 객체를 할당했지만, 더 이상 참조되지 않는 객체

가비지 컬렉션(Garbage Collection, 이하 GC) : 가비지들을 제거 하는 작업

01

Garbage Collector 란?


  • 하나의 객체는 메모리를 점유하는데 사용하지 않는 객체는 메모리 최적화를 위해 메모리 점유를 해제해줘야 한다.
  • C언어에서는 개발자 직접하는 수행, Java언어 에서는 JVM이 메모리 관리를 수행
  • new 연산자 등으로 생성된 객체(인스턴스)와 배열이 heap영역에 존재하며 다른 객체에서 참조된다.
  • 참조(레퍼런스)되지 않는 객체들은 GC과정을 통해 메모리에서 제거된다
  • java에서 heap 영역은 Runtime Data Area 안에 존재한다

stack과 heap에서 객체가 적재되는 방법

public class Main{
    public static void main(String[] args){
        int num = 10;
        String name = "긷";
        Person person = new Person("긷", 26);
        name += "뚜";
       }
 }

01

문제1) 이 상태에서 code의 4번째 대로 name += “뚜” 라는 과정을 통해 “긷뚜”라는 새로운 String을 만들게 되면 “긷뚜” 값이 새로 heap에 적재되고 기존에 존재하던 “긷”이라는 String은 참조 없이 heap에 존재하게 된다

01 문제2) 만약 main함수 스코프가 끝나게 되면 stack에 쌓인 모든 변수가 사라지게 되며 존재하던 모든 데이터가 참조없이 존재하게 된다

01 이렇게 참조없이 남겨진 메모리들을 java에서는 GC가 처리해준다

Heap영역

01 01

  • Eden 영역 : Young 영역. 새롭게 생성된 객체가 위치한 영역. 정기적으로 GC가 발생하며 살아남은 객체는 Survivor1, Survivor2 영역 중 하나로 이동
  • Survivor1, Survivor2 영역 : Young 영역. 한 영역이 꽉찰 때까지 적재되다가 꽉차면 GC가 발생하고 남은 객체는 다른 한 영역으로 이동. 따라서 둘 중 하나는 비워진 상태가 정상이다.
    • Minor GC : Young 영역에서 발생하는 GC.
    • Promotion : 객체가 Survivor1, Survivor2 영역을 번갈아 이동할 때마다 객체의 age가 증가하는데 일정 age 이상이되면 Old영역으로 이동하게 되는 것
  • Old 영역 : Young 영역보다 크기가 크고 GC는 적게 발생한다.
    • Survivor영역에 들어가기에 크기가 큰 객체의 경우 바로 Old영역으로 이동되기도 한다
    • 기본적으로 데이터가 가득 찬 경우에 GC가 실행된다.
    • Major GC(Full GC) : Old 영역에서 발생하는 GC.

Garbage Collector 과정


  • ⇒ Mark and Sweep
    1. Mark
      • stack에서는 변수들을 스캔하면서 각각 어떤 객체(인스턴스)를 참조하고 있는지 마킹한다
      • heap에서는 참조가 있으면 reachable 참조가 없으면 unreachable 로 구별하면서 마킹한다(reachable 상태도 마킹) → reachability
    2. Sweep
      • 마킹되지 않은 객체, unreachable 로 구분된 객체를 찾아 heap에서 제거한다

Garbage Collector 종류


Serial GC

  • 하나의 CPU로 Young 영역과 Old 영역을 연속적으로 처리하는 방식
  • GC가 수행될 때 STW가 발생

Parallel GC

  • Parallel GC의 목표는 다른 CPU가 GC의 진행시간 동안 대기 상태로 남아 있는 것을 최소화
  • Serial GC의 Young 영역에서 진행하는 방식을 병렬로 처리하여 부하를 줄임

Parallel Compacting GC

  • Parallel GC에서 Old 영역의 알고리즘을 변경

Concurrent Mark-Sweep(CMS) GC

  • Application의 Thread와 GC Thread가 동시에 실행되어 STW를 최소화 하는 GC
  • Parallel GC와는 Compaction 작업 유무로 구분
  • Compaction은 메모리 공간에서 사용하지 않는 빈 공간이 없도록 옮겨서 메모리 분산을 제거하는 작업

참고


Tags:

Categories:

Updated:

Leave a comment