GC

가비지 컬렉션

  • 메모리에서 사용하지 않는 객체를 삭제하는 과정을 GC라고 하며 GC는 JVM에서 수행합니다.

세상을 멈춰

  • JVM은 GC를 실행하기 위해 애플리케이션 실행을 중지합니다.
  • 어떤 GC 알고리즘을 사용하든 세계는 멈출 것입니다.
    • 이 시간을 단축하는 것이 GC 튜닝입니다!!
  • GC 후 여유 메모리가 더 이상 없는데도 여전히 메모리 할당을 시도하고 있다면,
    • OutOfMemoryError가 발생하고 WAS가 실패했을 수 있습니다.
  • 따라서 대규모 JAVA 애플리케이션을 효율적으로 개발하기 위해서는 GC에 익숙해져야 합니다.

GC의 목표

  1. 객체가 NULL인 경우
  2. 블록 실행이 완료된 후 블록 내에서 생성된 객체
  3. 부모 개체가 null이면 포함하는 자식 개체

GC 메모리 해제 프로세스(Mark and Sweap)

  1. 표시
    • 프로세스 호출 표시 → GC가 메모리 점유 여부를 알아냅니다.
    • 모든 물체는 결정을 위해 마킹 단계에서 스캔됩니다. 모든 개체를 스캔하기 때문에 많은 시간이 소요됩니다.
  2. 정상적인 삭제
    • 참조되지 않은 개체를 제거하고 메모리를 반환합니다. 메모리 할당자는 반환된 빈 블록의 참조 위치를 저장하고 새 개체가 선언될 때 할당합니다.
  3. 압축
    • 성능을 향상시키려면 참조되지 않은 개체를 제거하고 나머지 참조된 개체도 바인딩하십시오. 번들로 저장 공간을 확보하여 새 저장 공간을 더 쉽고 빠르게 할당할 수 있습니다.

세대 가비지 수집 배경


  • 위의 과정에서와 같이 모든 객체를 표시하고 압축하는 JVM은 비효율적입니다.
  • y축은 할당된 바이트 수이고 x축은 바이트가 할당된 시간입니다. 시간이 지남에 따라 더 적은 개체가 남아 있음을 알 수 있으며 위의 다이어그램을 기반으로 약한 세대 가설오전.

약한 세대 가설

  • 새로 생성된 개체의 대부분은 곧 사용되지 않고 이전 개체에서 새 개체로의 참조가 거의 없을 것이라는 가설이 있습니다.
  • 이 가설에 따라 Java는 메모리를 Young 도메인과 Old 도메인으로 구분하여 새로 생성된 개체는 Young 도메인에, 수명이 긴 개체는 Old 도메인에 보관합니다.

세대 쓰레기 처리


  1. 젊은 지역
    • 새로 생성된 대부분의 개체가 있는 위치입니다.
    • 대부분의 객체는 빠르게 액세스할 수 없게 되므로 많은 객체가 Young 공간에서 생성되고 소멸됩니다. 그만큼 해당 영역에서 개체가 사라지면 작은 GC가 발생한다고 합니다.
  2. 오래된 지역
    • 여기에서 액세스할 수 없게 되지 않고 Young 영역에서 살아남은 개체가 복사됩니다. 대부분의 Young Range보다 크게 할당되며, 크기가 크기 때문에 Young Range보다 GC가 적게 발생합니다. 이 영역에서 개체가 사라지면 이를 대규모 GC라고 합니다.
  3. 영구 영역
    • 메서드 영역이라고도 합니다. 여기에는 클래스 및 메소드를 설명하기 위해 JVM에 필요한 메타데이터가 포함됩니다. JDK8부터는 PermGen이 Metaspace로 대체됩니다.