[JAVA] Garbage Collection(가비지 컬렉션)이란?

[JAVA] Garbage Collection(가비지 컬렉션)이란?


JVM의  Runtime Data Area의 Heap부분의 가비지 컬렉션이 궁금해졌다


먼저 Heap(힙)부분을 정리해보자

  • 인스턴스는 소멸 방법과 소멸 시점이 지역 변수와는 다르기에 힙이라는 별도의 영역에 할당된다.
  • 자바 가상 머신은 매우 합리적으로 인스턴스를 소멸시킨다.
  • 더 이상 인스턴스의 존재 유무가 없을 때 소멸시킨다.

New/ Young 영역

  • Eden : 객체들이 최초로 생성되는 공간
  • Survivor 0/1 : Eden에서 참조되는 객체들이 저장되는 공간

Old 영역

  • New area에서 일정 시간 참조되고 있는, 살아남은 객체들이 저장되는 공간 Eden영역에 객체가 가득차게 되면 첫번째 GC(minor GC)가 발생함
  • Eden영역에 있는 값들은 Survivor 1 영역에 복사되고 이 영역을 제외한 나머지 영역의 객체들은 삭제됨

Permanent Generation

  • 생성된 객체들의 정보의 주소값이 저장된 공간
  • Class loader에 의해 load되는 Class, Method 등에 대한 Meta 정보가 저장되는 영역
  • JVM에 의해서 실행됨
---------------------------------------------------------------------------------------------------------------------------------------------------------------

Minor GC

  • 새로 생성된 객체(instance)는 Eden 영역에 위치함
  • Eden영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동
  • 이 과정을 반복하다가 계속 살아남아 있는 객체는 일정 시간 참조되고 있다는 뜻으로 Old영역으로 이동함

Major GC

  • Old영역에 있는 모든 객체들을 검사하여 참조되지 않은 객체들을 한꺼번에 삭제함
  • 시간이 오래 걸리고 실행 중 프로세스가 정지된다
    • 이것을 Stop the world라고 하는데 
    • Major GC가 발생하면 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다
    • GC 작업이 완료한 이후에야 중단했던 작업을 다시 시작함

Garbage Collection은 어떤 원리로 소멸시킬 대상을 선정할까?

  • 어떤 힙 영역에 할당된 객체가 유효한 참조가 있으면 reachability 없으면 unreachability로 판단함
  • 하나의 객체는 다른 객체를 참조하고, 다른 객체는 또 다른 객체를 참조할 수 있기 때문에 참조 사슬이 형성이 되는데, 이 참조 사슬 중 최초에 참조한 것을 Root Set이라고 함
  • 힙 영역에 있는 객체들은 총 4가지의 경우에 대한 참조를 하게 됨
    1. 힙 내의 다른 객체에 의한 참조
    2. Java스택, 즉 Java 메서드 실행 시에 사용하는 지역변수와 파라미터들에 의한 참조
    3. 네이티브 스택에 의해 생성된 객체에 대한 참조
    4. 메서드 영역의 정적 변수에 의한 참조
  • 2,3,4는 Root Set이다. 즉, 참조 사슬 중 최초에 참조한 것
  • GC의 대상이 되었다고 바로 소멸하는 것은 아니다.
  • GC의 실행은 시스템에 부담이 될 수 있기에 GC는 별도의 알고리즘을 통해 타이밍을 스케쥴을 짠다


출처


댓글

이 블로그의 인기 게시물

[Python] # -*- coding: utf-8 -*-를 쓰는 이유

[소프트웨어공학] NS(Nassi-Schneiderman) 차트

[컴퓨터네트워크] Telnet이란?