Permgen과 Java의 Metaspace

1. 소개

이 빠른 자습서에서는 Java 환경에서 PermGen과 Metaspace 메모리 영역 간의 차이점을 살펴 보겠습니다 .

Java 8부터 Metaspace가 PermGen을 대체하여 상당한 변화를 가져온다는 점을 기억하는 것이 중요합니다.

2. PermGen

PermGen (영구 생성)은 주 메모리 힙에서 분리 된 특수 힙 공간 입니다.

JVM은 PermGen에서로드 된 클래스 메타 데이터를 추적합니다. 또한 JVM은이 메모리 섹션에 모든 정적 컨텐츠를 저장합니다. 여기에는 모든 정적 메서드, 기본 변수 및 정적 개체에 대한 참조가 포함됩니다.

또한 바이트 코드, 이름 및 JIT 정보에 대한 데이터를 포함합니다 . Java 7 이전에는 String Pool도이 메모리의 일부였습니다. 고정 풀 크기의 단점은 우리의 글에 나열되어 있습니다.

32 비트 JVM의 기본 최대 메모리 크기는 64 비트 버전의 경우 64MB 및 82MB입니다.

그러나 JVM 옵션을 사용하여 기본 크기를 변경할 수 있습니다.

  • -XX : PermSize = [size] 는 PermGen 공간의 초기 또는 최소 크기입니다.
  • -XX : MaxPermSize = [size] 는 최대 크기입니다.

가장 중요한 것은 Oracle이 JDK 8 릴리스에서이 메모리 공간을 완전히 제거했다는 것입니다. 따라서 Java 8 이상 버전에서 이러한 튜닝 플래그를 사용하면 다음과 같은 경고가 표시됩니다.

>> java -XX:PermSize=100m -XX:MaxPermSize=200m -version OpenJDK 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0 OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0 ...

제한된 메모리 크기로 PermGen은 유명한 OutOfMemoryError 생성에 관여 합니다. 간단히 말해서, 클래스 로더가 제대로 가비지 수집되지 않았고 결과적으로 메모리 누수가 발생했습니다.

따라서 메모리 공간 오류가 발생합니다. 이것은 새로운 클래스 로더를 만드는 동안 대부분 개발 환경에서 발생합니다.

3. 메타 스페이스

간단히 말해서 Metaspace는 Java 8 버전부터 시작하는 새로운 메모리 공간입니다. 이전 PermGen 메모리 공간을 대체했습니다 . 가장 중요한 차이점은 메모리 할당을 처리하는 방법입니다.

특히이 기본 메모리 영역은 기본적으로 자동으로 증가 합니다.

또한 메모리를 조정하는 새로운 플래그가 있습니다.

  • MetaspaceSizeMaxMetaspaceSize – Metaspace 상한을 설정할 수 있습니다.
  • MinMetaspaceFreeRatio – 가비지 수집 후 사용 가능한 클래스 메타 데이터 용량의 최소 백분율입니다.
  • MaxMetaspaceFreeRatio – 공간의 감소를 방지하기 위해 가비지 콜렉션 후 사용 가능한 클래스 메타 데이터 용량의 최대 백분율입니다.

또한 가비지 수집 프로세스는 이러한 변경으로 인해 몇 가지 이점을 얻습니다. 이제 가비지 수집기는 클래스 메타 데이터 사용량이 최대 메타 스페이스 크기에 도달하면 자동으로 데드 클래스 정리를 트리거합니다.

따라서이 개선으로 JVM은 OutOfMemory 오류가 발생할 가능성을 줄 입니다.

이러한 모든 개선에도 불구하고 메모리 누수를 방지하려면 메타 스페이스를 모니터링하고 조정해야합니다.

4. 요약

이 빠른 글에서 우리는 PermGen 및 Metaspace 메모리 영역에 대한 간략한 설명을 제공했습니다. 또한 각각의 주요 차이점을 설명했습니다.

PermGen은 여전히 ​​JDK 7 및 이전 버전과 함께 제공되지만 Metaspace는 애플리케이션에 더 유연하고 안정적인 메모리 사용을 제공합니다.