JDK 8의 PermGen 제거


229

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

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

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


4
다음과 같은 정보를 얻을 수 있습니다. javaeesupportpatterns.blogspot.co.uk/2013/02/…
Andrew Martin

답변:


358

이러한 주장을 무시하는 이유는 다음과 같은 단점으로 인해 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 성능도 향상되었습니다. 자세한 세부 사항


29
내부 문자열은 이전에 PermGen 공간에 저장되었지만 Java 7의 기본 Java 힙으로 이동되었다는 것을 언급해야합니다.
gparyani

자세한 설명을 주셔서 감사합니다.
Pradeep

3
일반 사용자를위한 약간의 소개 (주로 Java를 사용하지 않는 사람들, 예를 들어 JVM을 다루어야하는 동료 직원)는이 답변에 해를 끼치 지 않을 것입니다.
ulidtko


19

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


3
'HotSpot JVM은 이제 클래스 메타 데이터를 표현하기 위해 기본 메모리를 사용하고 있습니다. -이전에 사용한 메모리 HotSpot JVM은 무엇입니까? 그리고 '천연 기억'은 무엇입니까?
Andrey M. Stepanov


12

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

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

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

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.