Garbage Collector

김민창·2022년 1월 15일
0
post-thumbnail

JVM이란?

  • 운영체제의 메모리 영역에 접근하여 메모리를 관리하는 프로그램
    메모리 관리, Garbage Collector 수행

Garbage Collector

  • 동적으로 할당한 메모리 영역 Heap에서 사용하지 않는 영역을 탐지하여 해제하는 기능

Stack

  • 정적으로 할당한 메모리 영역
  • 원시 타입의데이터가 값과 함께 할당
  • Heap영역에 생성된 Object 타입의 데이터의 참조 값 할당

Heap

  • 동적으로 할당한 메모리 영역
  • 모든 Object 타입의 데이터가 할당
  • Heap영역의 Object를 가리키는 참조 변수가 Stack에 할당

Garbage Collector의 대상

public class Main{
  public static void main(String[] args) {
    int num1 = 10;
    int num2 = 5;
    
    String name = "pang";
  }
}
  • 위와 같은 코드가 실행된다고 가정한다면, 순차적으로 num1 = 10, num2 = 5, 객체 String을 참조하는 변수 nameStack에 저장됨
  • StringObject이기 때문에 Heap에 저장

  • 메서드가 종료된다면 Stack 영역의 데이터는 소멸되지만, Heap 영역의 객체 타입만 남게 된다.

  • 결국 Heap에 저장되어 있는 객체 타입으로 데이터만 남게되고, 이러한 데이터를 unreachable object라고 부르며, garbage collector의 대상이 된다.


Garbage Collector 과정

  1. Garbage collectorStack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 마킹한다.

  2. Reachable Object가 참조하고 있는 객체도 찾아서 마킹한다.

  3. 마킹되지 않은 객체를 Heap에서 제거한다.

  • 1, 2는 확인하는 과정이기에 Mark
    3은 제거하는 과정이라 Sweep 라고 부른다.

Garbage Collection는 언제?

  • Heap 영역은 New Generation, Old Generation으로 나뉘고 특히 New GenerationEden, Survival 0, Survival 1으로 나뉜다.
  1. 새로운 객체는 Eden 영역에 할당된다.

  2. Eden 영역의 메모리가 모두 사용되었다면 GC가 발생한다.

  3. Eden 영역에 GC가 발생한 후, Reachable 객체는 Survival 0으로 옮겨진다.

  4. 1~3의 과정이 반복되면서 Survival 0이 다찬다면 Survival 0영역에 대해 Mark & Sweep가 일어난다.

  5. Survival 0영역에 Mark & Sweep가 일어나면 Survival 0 영역의 객체는 Survival 1영역으로 이동하며, 이동한 객체는 Age값이 증가.

  1. 1~3의 과정이 반복되며 Eden 영역에서 GC가 발생했다면 Survival 0, Survival 1 영역 중 이미 객체가 차있는 공간에 쌓이게 된다.
    둘중 하나는 항상 비어있는 상태로 유지가 된다.

  2. 이러한 과정이 반복되며 Age 값이 특정 값 이상이 된다면 Old Generation 영역으로 옮겨진다. 이러한 과정을 Promotion이라고 한다.

  3. Old Generation 영역이 가득 차게된다면 GC를 실행하게 되는데 이것을 Major GC 라고 부른다.

출처

profile
개발자 팡이

0개의 댓글