[Java] 의 Garbage Collection에 대해 알아보자

김우경·2021년 5월 28일
0

Garbage란?

  • 주소를 잃어버려서 사용할 수 없는 정리되지 않은 메모리
  • 앞으로 사용하지 않고 메모리를 가지고 있는 객체

Garbage Collector

  • 이러한 가비지들을 메모리에서 정리하여 다른 용도로 사용할 수 있게 해주는 프로그램

  • 자바는 개발자가 명시적으로 메모리 해제를 수행하지 않고, 가비지 컬렉터가 대신 해줌
    → C에서는 free()를 이용해서 직접 해제

  • GC의 대상 : 객체가 NULL 인 경우, 블록 안에서 객체가 생성되고 블록의 실행이 끝난 경우

GC의 동작

Minor GC와 Major GC

GC는 두가지 가정 하에 동작한다.

  1. 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다.
  2. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.

이 가설에 기반하여, 영역을 young 영역, old 영역 두가지로 나눈다.

→ young 영역에서의 GC가 Minor GC, old 영역에서의 GC가 Major GC이다.

Minor CG

  • young 영역 : eden영역 + 2*survivor 영역
  1. 새롭게 생성되는 객체는 eden 영역에 생성
  2. eden 영역이 가득차게 된다면 minor GC → 살아남은 객체들을 survivor영역 중 하나로
  3. survivor 영역이 가득차게 되면 살아남은 객체를 다른 survivor 영역으로
  4. aging이 되고 정해진 threshold를 넘으면, old 영역으로

Major GC

Old 영역의 메모리가 부족해지면 발생하게 된다.

→ Old 영역은 Young 영역보다 크고, Young 영역을 참조할 수도 있기 때문에 일반적으로 Minor GC보다 오래걸림

동작방식

stop-the-world

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

    → GC 관련 스레드를 제외한 모든 스레드의 동작을 중단

    → GC 튜닝? 이 stop-the-world 시간을 줄이는 것

Mark and Sweep

  • Mark: 힙(heap) 내의 객체 중에서 가비지를 식별하는 작업

    → reachability라는 개념을 사용 : 어떤 객체에 유효한 참조가 있으면 'reachable'로, 없으면 'unreachable'로 구별하고, unreachable 객체를 가비지로 간주해 GC를 수행

  • Sweep: Mark 단계에서 찾은 가비지를 처리해서 메모리를 회수하는 작업

출처

https://d2.naver.com/helloworld/329631
https://d2.naver.com/helloworld/1329

profile
Hongik CE

0개의 댓글