Heap 영역을 제외한 GC 처리 영역

네이티브 메모리 영역

  • 네이티브 메모리 영역에는 아래와 같은 데이터들이 저장된다.

    • Metaspace

    • Threads

    • Code Cache

    • GC

    • Symbols

    • Native Byte Buffers

  • 이중에서 Metaspace와 Code Cache 영역은 GC가 관리해준다.

Metaspace

  • JDK 8에서 도입된 영역으로, Hotspot VM의 네이티브 메모리 관리자

  • 클래스가 로딩될 때 할당되는 메타데이터에 대한 메모리 관리를 담당


  • 일반적으로 한 클래스의 메타데이터는 로딩을 담당하는 클래스 로더의 생명주기와 관련이 있다. 만약 해당 클래스 로더가 GC에 의해 제거되면 관련된 클래스들의 대량 메타데이터가 제거(소실)된다.

  • GC는 Metaspace 사용량이 최대치에 도달하면 참조되지 않는 클래스의 수집을 처리(트리거)한다. 따라서

  • Permanent

    • 특수한 힙 영역이었지만, JDK 8 이후부터 Metaspace로 인해 대체되었다.

    • static 메서드와 필드에 대한 참조, primitive type 변수, 바이트코드에 대한 데이터와 이름, JIT 컴파일에 대한 정보를 포함하는 영역이었다.

Code Cache

  • JIT 컴파일러가 가장 많이 사용하는 영역으로, Java 바이트코드를 컴파일한 네이티브 코드를 저장해두는 곳이다.

  • JVM의 Code Cache sweeper 스레드가 더이상 사용되지 않는 코드 세그먼트를 제거해가며 메모리를 관리한다.

  • 고정된 크기로 프로그램이 실행되기 때문에 확장이 불가능하며, 용량이 가득차면 JIT 컴파일러가 동작하지 않아 성능 부하를 야기할 수 있다.

Last updated