[java] JDK 8의 PermGen 제거

JDK 8을 설치하고 Eclipse를 실행하려고했습니다. 다음과 같은 경고 메시지가 나타납니다.

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0 

이 VM 옵션을 무시해야하는 이유는 무엇입니까?



답변

이러한 주장을 무시하는 이유는 다음과 같은 단점으로 인해 JDK8 용 HotSpot에서 영구 생성이 제거되었습니다.

  • 시작시 고정 크기 – 조정하기 어렵습니다.
  • 내부 핫스팟 유형은 Java 객체였습니다. 완전 GC로 이동할 수 있습니다. 불투명하고 강력한 유형이 아니며 디버깅하기 어려운 메타 메타 데이터가 필요합니다.
  • 전체 콜렉션 단순화 : 각 콜렉터의 메타 데이터에 대한 특수 반복자
  • GC 일시 정지 중에가 아닌 클래스 데이터를 동시에 할당 해제하려고 함
  • PermGen에 의해 제한되었던 향후 개선을 가능하게합니다.

Perment Generation (Perment Generation) 공간이 완전히 제거되었으며 메타 스페이스라는 새로운 공간으로 대체되었습니다. PermGen 제거 결과는 분명히 PermSize 및 MaxPermSize JVM 인수가 무시 되며 java.lang.OutOfMemoryError : PermGen 오류가 발생하지 않습니다.

MetaSpace의 장점

  • Java 언어 사양 속성 활용 : 클래스 및 관련 메타 데이터 수명은 클래스 로더와 일치합니다.
  • 로더 당 저장 영역 – 메타 스페이스
  • 선형 할당 만
  • 개별 교정 없음 (RedefineClasses 및 클래스 로딩 실패 제외)
  • GC 스캔 또는 압축 없음
  • 메타 스페이스 개체를 재배치하지 않음

메타 스페이스 튜닝

최대 메타 스페이스 크기는 -XX : MaxMetaspaceSize 플래그를 사용하여 설정할 수 있으며 기본값은 무제한이므로 시스템 메모리 만 제한됩니다. -XX : MetaspaceSize 조정 플래그는 메타 스페이스의 초기 크기를 정의합니다.이 플래그를 지정하지 않으면 메타 스페이스는 런타임시 응용 프로그램 요구에 따라 동적으로 크기가 조정됩니다.

변화는 미래에 다른 최적화와 기능을 가능하게합니다

  • 응용 프로그램 클래스 데이터 공유
  • 젊은 컬렉션 최적화, G1 클래스 언로드
  • 메타 데이터 크기 감소 및 내부 JVM 풋 프린트 프로젝트

GC 성능도 향상되었습니다. 자세한 세부 사항


답변

이것은 JDK Enhancement Proposals 122의 일부인 Java 8의 새로운 기능 중 하나입니다 .

핫스팟 JVM에서 영구 생성을 제거하므로 영구 생성의 크기를 조정해야합니다.

Java 8에 포함될 모든 JEP 목록은 JDK8 마일스톤 페이지 에서 찾을 수 있습니다 .


답변

Perment (Permanent Generation) 공간이 완전히 제거되었으며 메타 스페이스라는 새로운 공간으로 대체되었습니다. PermGen 제거의 결과는 분명히 PermSize 및 MaxPermSize JVM 인수가 무시되고 java.lang.OutOfMemoryError: PermGen 오류가 발생 하지 않습니다 .
JDK 8 HotSpot JVM은 이제 클래스 메타 데이터를 표현하기 위해 기본 메모리를 사용하고 있으며이를 메타 스페이스라고합니다. 더 읽기 >>


답변

PermGen 공간이 제거 되었기 때문입니다. 메모리 관리가 약간 변경되었습니다.

자바 -8 permgen-metaspace


답변

PermGen 공간은 Java 8에서 MetaSpace로 대체됩니다. PermSize 및 MaxPermSize JVM 인수는 무시되고 시작시 존재하는 경우 경고가 발행됩니다.

클래스 메타 데이터에 대한 대부분의 할당은 이제 기본 메모리에서 할당됩니다. * 클래스 메타 데이터를 설명하는 데 사용 된 클래스가 제거되었습니다.

이전 PermGen과 새로운 MetaSpace의 주요 차이점은 메모리 사용량의 상한을 강제로 정의 할 필요가 없다는 것입니다. MetaSpace 공간 제한을 무제한으로 유지할 수 있습니다. 따라서 메모리 사용량이 증가하면 OutOfMemoryError 오류가 발생하지 않습니다. 대신 예약 된 기본 메모리가 증가하여 메모리 사용량이 가득 찼습니다.

MetaSpace에 대한 최대 공간 제한을 정의하면 OutOfMemoryError : Metadata space가 발생합니다. 따라서 메모리 낭비를 피할 수 있도록이 제한을 신중하게 정의하는 것이 중요합니다.


답변

Java 8에 대한 Oracle의 JVM 구현은 PermGen 모델을 제거하고 Metaspace 로 대체했습니다 .


답변