JAVA 8:영구 구역(PermGen)에서 원 공간(Metaspace)까지

본문
주소.
눈 치 챘 어?
JDK 8 초기 접근 가능 버 전다운 로드 를 제 공 했 습 니 다.자바 개발 자 는 자바 8 이 제공 하 는 새로운 언어 와 운영 특성 을 사용 하여 실험 을 할 수 있 습 니 다.그 중 하 나 는 영구 세대(Permanent Generation(PermGen)를 완전히 제거 하 는 것 이다.이 는 JDK 7 부터 Oracle 이 움 직 이기 시작 했다.예 를 들 어 현지 화 된 String 은 JDK 7 부터 영구 세대(Permanent Generation)를 제거 했다.JDK 8 은 결국 은퇴 시 켰 다.
본 고 는 지금까지 제 가 수집 한 영구 세대(Permanent Generation)의 대체 자:메타 공간(Metaspace)에 대한 정 보 를 공유 할 것 입 니 다.JAVA 프로그램 을 수행 할 때 핫 스 팟 1.7 과 핫 스 팟 1.8(b75)의 운행 행 위 를 비교 해 보 겠 습 니 다.
메타 공간(Metaspace)의 마지막 규범,파라미터 조정,문 서 는 자바 8 이 정식으로 발 표 된 후에 공 개 됩 니 다.
 
메타 공간(Metaspace):새로운 메모리 공간의 탄생 Oracle Jrockit 과 IBM JVM 과 유사 하 게 JDK 8.HotSpot JVM 은 로 컬 화 된 메모리 저장 클래스 의 메타 데 이 터 를 사용 하기 시 작 했 습 니 다.이 공간 을 메타 스페이스(Metaspace)라 고 합 니 다.
좋 은 소식 은 자바.lang.OutOf Memory Error:PermGen 의 공간 문제 가 더 이상 존재 하지 않 고 이 메모리 공간 을 조정 하고 감시 할 필요 가 없다 는 것 을 의미 합 니 다.아직 빠 르 지 는 않 지만.이 변화 가 기본적으로 실 행 될 때,우 리 는 클래스 의 메타 데이터 의 메모리 점용 율 을 걱정 해 야 하 는 문 제 를 발견 할 수 있 습 니 다.따라서 이 새로운 기능 은 클래스 와 클래스 의 메모리 누 출 을 기적 적 으로 제거 하지 않 는 다 는 것 을 기억 하 십시오.이 문제 들 을 추적 하기 위해 서 는 다양한 방식 과 새로운 명 사 를 배 워 야 한다.
나 는 네가 영구 테이프 제거 의 총 결 과 를 읽 을 것 을 건의 한다.
Jon 의 이 문제 에 대한 의견.
 요약:
영구 구역 의 상황:
  • 이 메모리 공간 은 완전히 제거 되 었 다. 
  • JVM 인자 PermSize 와 MaxPermSize 는 무 시 됩 니 다.현재 시작 할 때 경고 메시지 가 있 습 니 다. 

  • 메타 공간(Metaspace)메모리 할당 모델
  • 현재 대부분의 클래스 메타 데 이 터 는 현지 화 메모리 에 분 배 됩 니 다.
  • 우 리 는 클래스 의 메타 데 이 터 를 설명 하 는 klasses 가 제거 되 었 습 니 다. 

  • 원 공간의 용량
  • 기본 적 인 상황 에서 클래스 메타 데이터 분 배 는 사용 가능 한 이 컴퓨터 의 메모리 용량 에 제한 을 받는다(용량 은 32 비트 JVM 을 사용 하 느 냐 64 비트 운영 체제 의 가상 메모리 의 가용성 에 달 려 있다). 
  • 새로운 인자(MaxMetaspaceSize)를 사용 할 수 있 습 니 다.클래스 메타 데이터 에 사용 할 로 컬 메모 리 를 제한 할 수 있 습 니 다.특별한 지정 이 없 으 면 원 공간 은 프로그램 이 실 행 될 때 필요 한 동적 크기 에 따라 크기 를 설정 합 니 다. 

  • 원 공간의 쓰레기 회수
  • 클래스 메타 데이터 의 공간 이 매개 변수 인'MaxMetaspaceSize'가 설정 한 값 을 차지 하면 사망 대상 과 클래스 로 더 에 대한 쓰레기 수 거 를 촉발 합 니 다. 
  • 쓰레기 회수 의 빈도 와 지연 을 제한 하기 위해 적당 한 모니터링 과 메타 공간 조절 이 필요 하 다.메타 공간 이 너무 많은 쓰레기 수집 은 클래스 를 표시 할 수 있 습 니 다.클래스 로 더 메모리 가 새 거나 프로그램 에 공간 이 너무 작 습 니 다.

  • 자바 더미 공간의 영향 
  • 다양한 데이터 가 자바 더미 공간 으로 옮 겨 졌 다.이것 은 미래의 JDK 8 업그레이드 후 자바 더미 공간 이 계속 증가 하 는 것 을 발견 할 수 있 습 니 다.

  • 원 공간 모니터링
  • 원 공간의 사용 은 HotSpot 1.8 부터 상세 한 GC 로그 출력 이 있 습 니 다. 
  • 우리 가 B75 테스트 를 바탕 으로 했 을 때 Jstat 와 JVisualVM 은 아직 업그레이드 되 지 않 았 고 아직 오래된 영구적 인 공간 에 인용 되 었 다.현재 충분 한 이론 이 있 습 니 다.우 리 는 자바 프로그램 이 누설 하 는 행 위 를 통 해 우리 의 이 새로운 메모리 공간 을 관찰 할 수 있 습 니 다.
  •  영구 대 와 원 공간 운행 시 대조
    새로운 메타 공간 이 실 행 될 때의 행동 특징 을 잘 이해 하기 위해 메타 데이터 유출 자바 프로그램 을 만 들 수 있 습 니 다.
    여기,이곳소스 코드 다운로드:
    우 리 는 아래 의 장면 을 테스트 한다.
     
  • JDK 1.7 을 사용 하여 자바 프로그램 을 실행 하고 영구 메모리 공간 을 모니터링 하고 소 진 하기 위해 128 MB
  • 로 설정
  • JDK 1.8(B75)을 사용 하여 자바 프로그램 을 실행 하고 새로운 원 공간 메모리 의 겨울 성장 과 쓰레기 수 거 를 모니터링 합 니 다. 
  • JDK 1.8(B75)을 사용 하여 자바 프로그램 을 실행 합 니 다.MaxMetaspaceSize 를 128 MB 로 설정 하여 원 공간 을 똑 같이 소모 합 니 다.
  • JDK 1.7 @64-bit – PermGen depletion
  • 자바 프로그램 설정 50k 회 교체 
  • 자바 의 퇴적 공간 은 1024 MB
  • 자바 의 영구 세대 공간 은 128 MB (-XX:MaxPermSize=128m)

  • 보시 다시 피 JVisualVM 의 보고 서 는 30K+클래스 를 불 러 올 때 영구적 으로 소 진 됩 니 다.프로그램 과 GC 의 출력 파일 에서 도 소 모 를 발견 할 수 있 습 니 다.클래스 메타 데이터 누설 시 뮬 레이 터 작성 자
    Pierre-Hugues Charbonneau 블 로그:
     
    http://javaeesupportpatterns.blogspot.com에서 오 류 를 설명 했다.
     ERROR: java.lang.OutOfMemoryError: PermGen space
     。
    지금 우 리 는 HotSpot JDK 1.8 JRE 를 사용 하여 프로그램 을 실행 합 니 다.
     
    JDK 1.8 @64-bit – Metaspace dynamic re-size
  • 자바 프로그램 설정 50k 회 교체 
  • 자바 더미 공간 은 1024 MB 
  • 자바 원 공간 은 무한(기본 값) 

  •  보시 다시 피 상세 한 GC 출력 은 자바 프로그램 이 계속 증가 하 는 메타 데이터 의 메모리 사용량 을 만족 시 키 기 위해 JVM 메타 공간 을 20 MB 동적 으로 이 컴퓨터 의 메모리 사용량 을 328 MB 로 확대 합 니 다.쓰레기 수집 도 관찰 할 수 있 습 니 다.JVM 은 모든 데 드 클래스 나 클래스 로 더 대상 을 파괴 하려 고 합 니 다.자바 프로그램 이 유출 된 후부 터 JVM 은 메타 공간의 메모리 공간 을 확대 해 야 합 니 다.
    이 방안 은 50K 번 을 교체 할 수 있 으 며,OOM 이벤트 와 50K+클래스 를 불 러 오지 않 습 니 다.
    이어서 마지막 테스트 장면 을 보 겠 습 니 다.
    JDK 1.8 @64-bit – Metaspace depletion
  • Java 프로그램 설정 50k 회 교체
  • Java 쌓 기 공간 은 1024 MB 
  • Java 메타 공간 은 128 MB(-XX:MaxMetaspaceSize=128 m)
  • 보시 다시 피 JVisualVM 의 보고 서 는 30K+클래스 를 불 러 올 때 원 공간 이 소 진 되 어 JDK 1.7 에서 의 표현 과 매우 비슷 합 니 다.프로그램 과 GC 의 출력 로그 에서 도 찾 을 수 있 습 니 다.또 다른 재 미 있 는 현상 은 이 컴퓨터 의 메모리 사용 공간 이 지정 한 최대 크기 의 두 배 이상 이라는 것 이다.가능 하 다 면,이 컴퓨터 의 메모리 낭 비 를 피하 기 위해 서 입 니 다.이것 은 원 공간 확장 사 이 즈 를 최적화 하 는 전략 이 필요 하 다 는 것 을 나 타 낼 수 있다.
     현재 자바 프로그램의 출력 로그 에서 아래 의 이상 을 찾 을 수 있 습 니 다:
      
    view source
    print
    ? 1. Class metadata leak simulator 2. Author: Pierre-Hugues Charbonneau 3. <a href= "http://javaeesupportpatterns.blogspot.com" >http://javaeesupportpatterns.blogspot.com<;/a> 4. ERROR: java.lang.OutOfMemoryError: Metadata space 5. Done!
    예상대로 원 공간의 최대 사 이 즈 는 128 MB 로,우리 가 JDK 1.7 에서 처럼 50K 교체 계획 을 완수 하지 못 하 게 했다.JVM 에서 새로운 OOM 오 류 를 던 졌 습 니 다.상기 OOM 이 벤트 는 JVM 이 원 공간 에서 메모리 할당 을 캡 처 하 는 데 실 패 했 을 때 던 집 니 다.
     
    \#metaspace.cpp 끝 말
     나 는 네가 새로운 자바 8 원 공간 에 대한 초기 분석 과 실험 을 감상 할 수 있 기 를 바란다.현재 관측 에 따 르 면 우리 의 마지막 테스트 장면 에서 나타 나 는 빈번 한 원 공간 GC 와 OOM 과 같은 문 제 를 멀리 하기 위해 서 는 적절 한 모니터링 과 조정 이 필요 하 다.앞으로 의 글 에는 새로운 기능 과 관련 된 잠재 적 성능 개선 을 확인 하기 위해 성능 비 교 를 포함 할 수 있 습 니 다.언제든지 의견 을 제시 해 주 십시오. 

    좋은 웹페이지 즐겨찾기