본문으로 건너뛰기

Java Garbage Collection 이란? Mark and Sweep, Young, Old, Perm 개념 정리

  • Java 프로그래밍을 하다보면 Garbage Collection 이라는 용어를 자주 듣게 됩니다. 개발 초반에는 해당 지식이 없어도 개발이 가능하지만, 성능 최적화나 메모리 누수 등을 방지하기 위해 알아두면 좋은 내용입니다.
  • Java 를 사용하는 회사 면접에서도 자주 물어보는 주제 중 하나입니다.
  • 이 문서에서는 Java Garbage Collection 에 대해 쉽게 이해할 수 있도록 정리해보겠습니다.
  • 모르는 개념을 이해하기 위하여 간단히 정리한 내용이므로, 자세한 내용은 다른 글을 확인하면서 공부하시는 것을 추천드립니다.

Garbage Collection 이란?

  • Garbage Collection 이라는 이름은 쓰레기 수집이라는 뜻. 사용하지 않는 메모리를 자동으로 수집하는 기능
    • 사용하지 않는 메모리: 더 이상 사용되지 않는 메모리
    • 메모리 수집: 사용하지 않는 메모리를 해제하여 다시 사용할 수 있도록 함
  • 자바 메모리 관리는 JVM을 통해 이루어짐
    • 기존 언어는 메모리 할당과 해제를 프로그래머가 직접 처리해야 했음. 메모리 해제를 제대로 하지 않으면 사용하지 않는 메모리가 계속 쌓여 메모리 누수(memory leak)가 발생
    • JVM은 가상머신으로, 사용자가 신경쓸 필요 없이 자동으로 메모리 할당과 해제를 처리함
    • 프로그램 실행시 JVM 옵션을 주어서 JVM 이 사용할 메모리 크기를 지정
    • OS 레벨의 메모리에 직접 접근하지 않아 OS 레벨에서의 memory leak은 방지됨
  • Garbage Collection은 힙 영역에서 unreachable 객체들을 제거하여 메모리를 확보함
    • unreachable 객체: 더 이상 참조되지 않는 객체

Mark and Sweep 이란?

  • 특징
    • 가비지 컬렉션은 Mark and Sweep 방식으로 이루어짐
    • 가비지 컬렉션 후의 메모리 상태는 메모리 공간이 확보된 상태

Mark

  • Reachable 객체를 찾아 마킹함. Garbage Collector 가 스택의 모든 변수를 스캔하면서 각각 어떤 오브젝트를 레퍼런스하는지 찾음
  • Mark 작업을 위해 모든 스레드는 중단되는데, 이를 stop the world 라고 함
  • 위의 이유로 System.gc()를 호출하여 명시적으로 가비지 컬렉션을 일으킬 수 있으나 권장되지 않음

Sweep

  • 특징
    • 마킹되지 않은 객체를 제거함. Unreachable Object 제거

Heap 영역 - Young (Eden, Survivor), Old, Perm

  • Heap 영역은 Young Generation, Old Generation, Perm 영역으로 구성됨
  • 총 5개의 영역으로 구성됨
    • Young Generation: Eden, Survivor 0, Survivor 1
    • Old Generation
    • Perm 영역

image

Young Generation

  • Eden 영역, Survivor 0, Survivor 1 영역으로 구성
  • Eden 영역
    • 새로 생성된 객체가 위치하는 곳
    • Eden 영역이 가득차면 Minor GC 발생
  • Survivor 영역
    • Eden 영역에서 살아남은 객체가 위치하는 곳
    • S0, S1 두 영역이 있으며, 둘 중 하나는 비어있고 다른 하나는 살아남은 객체가 위치
    • 비어 있는 Survivor 영역으로, Eden 영역과 비어 있지 않은 Survivor 영역의 살아남은 객체를 이동
    • Survivor 영역에서 다른 Survivor 영역으로 이동할 때 age 값이 증가
    • 하기와 같이 이동
      • S0 에 살아남은 객체가 있고, S1 은 비어있음 -> Eden 영역과 S0 의 살아남은 객체를 S1 으로 이동
      • S1 에 살아남은 객체가 있고, S0 은 비어있음 -> Eden 영역과 S1 의 살아남은 객체를 S0 으로 이동
    • 이동할 때는 age 값이 증가 살아남은 객체는 다른 Survivor 영역으로 이동

Old Generation

  • 특징
    • Young Generation에서 살아남은 객체가 age 값이 특정값 이상이 되면 Old Generation 으로 옮겨짐
    • 위 단계를 Promotion 이라고 함

Perm 영역

  • 특징
    • 메타데이터, 클래스 정보 등이 저장되는 곳
    • Java 8 부터는 Metaspace 로 변경됨

Minor GC & Major GC & Full GC

  • 정리하는 Heap 의 영역에 따라 GC 를 Minor GC, Major GC, Full GC 로 구분함

Minor GC

  • 특징
    • Young Generation에서 발생하는 GC
    • Eden 영역에서 살아남은 객체를 Survivor 영역으로 이동
    • Survivor 영역이 가득차면, 살아남은 객체를 Old Generation으로 이동
  • 순서
    • Eden 영역이 가득차면 Minor GC 발생
    • Eden 영역과 Survivor 영역의 살아남은 객체를 비어있는 Survivor 영역으로 이동
      • Eden + S0 -> S1 or Eden + S1 -> S0
    • 이동할 때 age 값이 증가

Major GC

  • 특징
    • Old Generation에서 발생하는 GC
    • Old Generation 영역이 가득차면 Major GC 발생
    • Old Generation 영역에서 unreachable 객체를 제거함

Full GC

  • 특징
    • Young Generation, Old Generation, Perm 영역 전체에서 GC 수행
    • Full GC가 발생하면 모든 스레드가 중단됨
    • Full GC가 발생하면 Major GC, Minor GC, Perm 영역 GC가 모두 발생

출처