Garbage Collection

  • 사용하지 않는 객체는 메모리에서 삭제하는 작업을 GC라고 부르며 JVM에서 GC를 수행한다.

stop-the-world

  • GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것.
  • 어떤 GC 알고리즘을 사용하더라도 stop-the-world는 발생하게 된다.
    • 이 시간을 줄이는 것이 바로 GC튜닝!!
  • GC를 해도 더이상 사용 가능한 메모리 영역이 없는데 계속 메모리를 할당하려고 하면
    • OutOfMemoryError가 발생하여 WAS가 다운될 수 도 있다.
  • 따라서 규모있는 JAVA 어플리케이션을 효율적으로 개발하기 위해선 GC에 대해서 잘 알고 있어야 한다.

GC의 대상

  1. 객체가 NULL인 경우
  2. 블럭 실행 종료 후, 블럭 안에서 생성된 객체
  3. 부모 객체가 NULL인 경우, 포함하는 자식 객체

GC의 메모리 해제 과정(Mark and Sweap)

  1. Marking
    • 프로세스는 마킹을 호출 → GC가 메모리가 사용되는지 아닌지를 찾아낸다.
    • 모든 오브젝트는 마킹단계에서 결정을 위해 스캔되어 진다. 모든 오브젝트를 스캔하기 때문에 매우 많은 시간이 소모된다.
  2. Normal Deletion
    • 참조되지 않는 객체를 제거하고, 메모리를 반환한다. 메모리 Allocator는 반환되어 비어진 블럭의 참조 위치를 저장해 두었다가 새로운 오브젝트가 선언되면 할당되도록 한다.
  3. Compacting
    • 퍼포먼스를 향상시키기 위해, 참조되지 않는 객체를 제거하고 또한 남은 참조되어지는 객체들을 묶는다. 이들을 묶음으로서 공간이 생기므로 새로운 메모리 할당 시에 더 쉽고 빠르게 진행할 수 있다.

Generational Garbage Collection 배경

  • 위의 과정과 같이 모든 객체를 Mark&Compact 하는 JVM은 비효율 적이다.
  • Y축은 할당된 바이트 수, X축은 바이트가 할당될 때의 시간. 시간이 갈수록 적은 객체만이 남는 다는 것을 볼 수 있고, 위와같은 그래프에 기반한 것이 Weak Generational Hypothesis이다.

Weak Generational Hypothesis

  • 신규로 생성한 객체의 대부분은 금방 사용하지 않는 상태가 되고, 오래된 객체에서 신규 객체로의 참조는 매우 적게 존재한다는 가설이다.
  • 이 가설에 기반하여 자바는 Young 영역과 Old 영역으로 메모리를 분할하고, 신규로 생성되는 객체는 Young영역에 보관하고, 오랫동안 살아남은 객체는 Old 영역에 보관한다.

Generational Garbage Collection

  1. Young 영역
    • 새롭게 생성한 객체의 대부분이 이곳에 위치한다.
    • 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에 많은 객체가 Young영역에 생성되고 사라진다. 이 영역에서 객체가 사라질때 Minor GC가 발생한다고 말한다.
  2. Old 영역
    • 접근 불가능 상태로 되지 않아 Young 영역에서 살아늠은 객체가 이곳으로 복사된다. 대부분의 Young 영역보다 크게 할당하며, 크기가 큰 만큼 Young 영역보다 GC는 적게 발생한다. 이 영역에서 객체가 사라질때 Major GC가 발생한다고 말한다.
  3. Permanent 영역
    • Method Area라고도 한다. JVM이 클래스들과 메서드들을 설명하기 위해 필요한 메타데이터들을 포함하고 있다. JDK8부터는 PermGen 은 Metaspace로 교체

'Computer science > JAVA' 카테고리의 다른 글

Interned String in Java  (0) 2023.03.22
Error & Exception  (0) 2023.03.16
JVM  (0) 2023.03.16
Instrinsic Lock  (0) 2023.01.08
Thread  (1) 2023.01.02

+ Recent posts