Java 7까지는 JVM 메모리에 PermGen 이라는 영역이 있었는데 , JVM이 클래스를 유지하는 데 사용되었습니다. Java 8 에서는 제거되고 Metaspace 라는 영역으로 대체되었습니다 .
PermGen과 Metaspace 의 가장 중요한 차이점 은 무엇입니까 ?
내가 아는 유일한 차이점 java.lang.OutOfMemoryError: PermGen space
은 더 이상 던질 수없고 VM 매개 변수 MaxPermSize
가 무시 된다는 것 입니다.
답변
사용자 관점과의 주요 차이점은 이전 답변에서 충분히 강조하지 않는다고 생각합니다. 기본적으로 Metaspace는 기본적 으로 크기가 자동으로 증가 하는 반면 PermGen은 항상 최대 크기가 고정되어 있다는 것입니다. JVM 매개 변수를 사용하여 Metaspace에 대해 고정 최대 값을 설정할 수 있지만 PermGen을 자동 증가시킬 수는 없습니다.
대체로 그것은 단지 이름의 변경 일뿐입니다. PermGen이 도입되었을 때는 Java EE 또는 동적 클래스 (언)로드가 없었기 때문에 일단 클래스가로드되면 JVM이 종료 될 때까지 메모리에 고정되어 영구 생성되었습니다. 요즘 클래스는 JVM의 수명 동안로드 및 언로드 될 수 있으므로 메타 스페이스는 메타 데이터가 보관되는 영역에 더 적합합니다.
둘 다 java.lang.Class
인스턴스를 포함하고 있으며 둘 다 ClassLoader 누출로 고통받습니다 . 유일한 차이점은 Metaspace 기본 설정을 사용하면 증상을 알아 차릴 때까지 더 오래 걸린다는 것입니다 (가능한 한 자동으로 증가하기 때문에). 즉, 문제를 해결하지 않고 더 멀리 밀어 내기 만하면됩니다. OTOH 저는 OS 메모리 부족의 영향이 JVM PermGen 부족보다 더 심각 할 수 있다고 생각하므로 많이 개선되었는지 확신 할 수 없습니다.
PermGen과 함께 JVM을 사용하든 Metaspace와 함께 사용하든 동적 클래스 언로드를 수행하는 경우 예를 들어 내 ClassLoader 누출 방지 라이브러리를 사용하여 클래스 로더 누출에 대한 조치를 취해야 합니다 .
답변
Bye, Bye PermGen, Hello Metaspace
PermGen 이 완전히 제거되었습니다.
메타 스페이스 가비지 수집 -클래스 메타 데이터 사용량이 .NET Framework에 도달하면 사용 불능 클래스 및 클래스 로더의 가비지 수집이 트리거 MaxMetaspaceSize
됩니다.
Metadata
보유 된 공간 은 더 이상에 인접하지 않습니다. 이제 Java heap
The metadata
는 Metaspace
.
간단히 말해서 ,
클래스 메타 데이터는 기본 메모리에서 할당되므로 사용 가능한 최대 공간은 사용 가능한 총 시스템 메모리입니다. 따라서 더 이상 만나지 않고 OOM errors
스왑 공간으로 쏟아 질 수 있습니다.
제거는 PermGen
클래스 로더 누수 문제가 사라 졌다는 것을 의미하지 않습니다. 그렇습니다. 누수로 인해 전체 네이티브 메모리가 소모되기 때문에 사용량을 모니터링하고 그에 따라 계획을 세워야합니다.
답변
간단히 말해, 메타 공간 크기는 제한되지 않은 경우 클래스 메타 데이터를로드하는 데 필요한 기본 메모리에서 자동으로 증가합니다. -XX:MaxMetaspaceSize