Metaspace

백기선 님의 <더 자바, Java 8>를 보고 공부한 내용을 기록합니다.

1. java8 이전, PermGen

  • JVM 의 힙 메모리 영역에는 원래 Eden generation, Old generation, Permanent generation 메모리 영역이 존재했었다.

  • PermGen 은 Permanent Generation 의 약자로, 클래스의 메타데이터를 모으는 곳이다.

  • heap 영역에 속하며,

  • 기본값으로 제한된 (고정된) 크기를 가지고 있다.

  • 동적으로 클래스를 많이 생성하거나 너무 많은 클래스가 생성되면 PermGen 영역이 꽉차서 OutofMemory Exception 이 발생할 수 있다.

    • 이때는 클래스를 계속 생성하는 것이 문제이므로, 원인이 되는 쪽 코드를 찾아 개선하는 수 밖에 없다.

  • PermGen 초기 사이즈 설정 : -XX:PermSize=N

  • PermGen 최대 사이즈 설정 : -XX:MaxPermSize=N

2. java8 이후, Metaspace

  • java8 이후로는 PermGen 메모이 영역이 사라지고, metaspace 라는 영역이 새로 생겼다.

  • 역시 클래스의 메타데이터를 담는 곳으로

  • Heap 영역이 아니라 Native memory 영역에 존재한다.

  • 자바 8부터는 PermGen 관련 java 옵션은 무시된다.

  • Metaspace 초기 사이즈 설정 : -XX:MetaspaceSize=N

  • Metaspace 최대 사이즈 설정 : -XX:MaxMetaspaceSize=N

3. 참고

  • http://mail.openjdk.java.net/pipermail/hotspot-dev/2012-September/006679.html

  • https://m.post.naver.com/viewer/postView.nhn?volumeNo=23726161&memberNo=3673

    3075

  • https://m.post.naver.com/viewer/postView.nhn?volumeNo=24042502&memberNo=3673

    3075

  • https://dzone.com/articles/java-8-permgen-metaspace

Last updated