program tip

PermGen과 Metaspace의 차이점은 무엇입니까?

radiobox 2020. 8. 12. 08:06
반응형

PermGen과 Metaspace의 차이점은 무엇입니까?


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 heapThe metadataMetaspace.

간단히 말해서 ,

클래스 메타 데이터가 기본 메모리에서 할당되므로 사용 가능한 최대 공간은 사용 가능한 총 시스템 메모리입니다. 따라서 더 이상 만나지 않고 OOM errors스왑 공간으로 쏟아 질 수 있습니다.

제거는 PermGen클래스 로더 누출 문제가 사라 졌다는 것을 의미하지 않습니다. 그렇습니다. 누수로 인해 전체 네이티브 메모리가 소모되기 때문에 사용량을 모니터링하고 그에 따라 계획을 세워야합니다.

분석이 포함 된 다른 기사 : Link1 , Link2this


간단히 말해, 메타 공간 크기는 제한되지 않은 경우 클래스 메타 데이터를로드하는 데 필요한 기본 메모리에서 -XX:MaxMetaspaceSize

참고 URL : https://stackoverflow.com/questions/27131165/what-is-the-difference-between-permgen-and-metaspace

반응형