답변:
영구 세대. 세부 사항은 물론 구현에 따라 다릅니다.
간단히 말해서, 클래스 및 인턴 문자열과 관련된 Java 객체를 포함합니다. 공유 기능을 사용하는 Sun의 클라이언트 구현에서는 classes.jsa약 절반은 읽기 전용이고 절반은 쓰기시 복사로 초기 데이터를 형성하도록 메모리 매핑됩니다.
단순히 오래된 Java 객체는 Tenured Generation에 보관됩니다.
PermGen은 JVM에서로드 된 클래스를 보유하는 데 사용됩니다. 다음을 사용하여 늘릴 수 있습니다.
-XX:MaxPermSize=384m
Sun JVM 또는 OpenJDK를 사용하는 경우.
따라서 OutOfMemoryException : PermGen이 발생하면 PermGen을 더 크게 만들어야하거나 클래스 로더 문제가있을 수 있습니다.
원래 질문과 실제로 관련이 없지만 누군가가 유용하다고 생각할 수 있습니다. PermGen은 실제로 Java가 클래스를 유지하는 데 사용되는 메모리 영역입니다. 그래서 우리 중 많은 사람들이 예를 들어 많은 수업이 있다면 PermGen에서 OOM을 접했습니다.
Java 8 이후 PermGen 영역은보다 효율적이고 기본적으로 무제한 (또는 32 비트 또는 64 비트 jvm 및 OS 가상 메모리 가용성에 따라 기본 메모리 양에 따라 더 정확하게 제한됨) 인 MetaSpace 영역으로 대체되었습니다. 그러나 예를 들어 영역에 대한 최대 제한을 지정하는 등 몇 가지 방법으로 조정할 수 있습니다. 이 블로그 게시물 에서 더 유용한 정보를 찾을 수 있습니다 .
PermGen은 영구 세대를 의미합니다 .
다음은 DDJ에 대한 간략한 설명입니다.
Permgen은 영구 세대를 의미합니다. JVM 메모리 영역 중 하나입니다. MaxPermSize라는 플래그를 사용하여 크기가 고정 된 힙의 일부입니다.
이름이 "PermGen"인 이유는 무엇입니까?
이 permgen은 Java 초기에 명명되었습니다. Permgen 메인은로드 된 클래스의 모든 메타 데이터를 유지합니다. 그러나 문제는 일단 클래스가로드되면 JVM이 종료 될 때까지 JVM에 남아 있다는 것입니다. 그래서 이름 permgen은 그것을 선택합니다. 그러나 나중에 클래스의 동적 로딩이 등장했지만 이름은 변경되지 않았습니다. 그러나 Java 8 에서는이 문제도 해결했습니다. 이제 permagen 로 이름이 바뀌 었습니다 MetaSpace 동적 메모리 크기.