Java MetaSpace

2023. 12. 12. 01:04·개발/Java
반응형

오늘은 Java 8 버전에서 등장한 MetaSpace에 대해 알아보자.

 

Permanent Generation

자바 7버전까지는 Permanent Generation이라는 영역이 존재했다.

줄여서 PermGen라고 부른다.

  • PermGen은 로드되는 클래스, 메서드 등에 관한 정보 등 메타 데이터(리플렉션)를 저장한다.
  • 모든 static 메서드, static 변수를 저장한다.
  • Java 7 버전까지는 String Pool도 PermGen의 일부
  • 바이트 코드, 이름, JIT 정보도 가지고 있다.
  • 이 영역은 제한된 메모리가 큰 단점이다.
  • 제한 된 메모리로 인해 Out Of Memory(OOM) 문제가 발생할 수 있다.

 

Permanent Generation은 Heap 영역인가?

위 사진만보면 PermGen은 Heap  영역 내부에 포함되는 것처럼 보인다.

 

자료를 찾아보면 많은 자료들이 PermGen을 Heap 영역 내부에 존재하는 것처럼 말한다.

 

자료를 찾아보니 PermGen은 오라클 기준 Method Area라고 불렸다.

JVM을 공부해보면 Method Area는 Heap과 같이 모든 스레드가 공유하는 영역이지만 엄밀히 말하면 Heap과는 다른 영역이다.

 

PermGen은 정말로 Heap 영역에 포함되는 것일까??

 

정확히 말하면 PermGen은 Heap 영역은 아니다.

 

오라클 공식문서에서는 PermGen을 설명하면서 non-heap이라고 적어놓았다.

 

 

더불어 힙 공간이 부족해지면 발생하는 에러와 PermGen이 부족해져서 발생하는 오류가 다르다.

java.lang.OutOfMemoryError: Heap space space
java.lang.OutOfMemoryError: PermGen space

 

 

MetaSpace

자바 8부터는 MetaSpace가 PermGen을 대체했다.

  • 로드되는 클래스, 메서드 등에 관한 메타 데이터(리플렉션) 저장
  • 힙이 아닌 Native 메모리 영역 사용
  • PermGen이 사라지면서 static 변수, String pool은 Heap 영역에 저장한다.
  • Native 영역의 크기는 운영체제가 동적으로 다룬다. 즉 자동 확장이 가능
  • MetaSpace가 Native 영역을 사용하면서 OOM의 대한 부담이 줄어들었다.

 

참고 자료

https://stackoverflow.com/questions/41358895/permgen-is-part-of-heap-or-not

https://www.inflearn.com/course/%EB%A9%B4%EC%A0%91-%EC%8B%A0%EC%9E%85-java-%EB%B0%B1%EC%95%A4%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9E%90/dashboard

https://www.linkedin.com/pulse/permgen-vs-metaspace-mohammed-elnwam/

https://www.baeldung.com/java-permgen-metaspace

반응형
'개발/Java' 카테고리의 다른 글
  • Java Thread (version 2)
  • equals()와 hashCode()
  • GC (Garbage Collection)
  • 자바 메모리 누수
Debin
Debin
공부 기록을 남기며 게시글 리팩토링을 진행하는 블로그입니다.
  • Debin
    리팩토링하는 블로그
    Debin
  • 전체
    오늘
    어제
    • 분류 전체보기
      • DB
        • DB 기초
        • MySQL
        • SQL 튜닝
      • OS
      • Network
      • Git
      • 디지털콘텐츠기획
      • 소프트웨어공학
      • 코딩테스트
        • 프로그래머스
        • 백준
        • 인프런
      • 공부 일지
      • 독서
        • 클린코드
        • 일상 속 사물이 알려주는 웹 API 디자인
        • 토비의 스프링
        • 객체지향의 사실과 오해
        • 자바 잘 읽는 법
      • 기록 및 회고
      • Cloud
        • AWS
      • 개발
        • Java
        • Spring Core
        • Spring MVC
        • Spring DB
        • Spring Boot
        • Spring Security
        • Spring Batch
        • JPA
        • Test
        • Android
      • 대외활동
        • UMC SERVER
        • 카엔프 SW 아카데미
      • 프로젝트
      • Docker
      • Gradle
      • ELK
      • 실무 이야기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

    • 본인 깃허브입니다!
  • 인기 글

  • 태그

    spring mvc
    ORM
    스프링 부트
    AWS
    SQL
    데이터베이스
    리눅스
    JPA
    Java
    AOP
    spring boot
    도커
    container
    객체
    spring
    자바
    인덱스
    컨테이너
    트랜잭션
    mysql
    test
    innodb
    프록시
    스프링
    운영체제
    객체지향
    토비의 스프링
    docker
    코딩 #개발자 #노마드북클럽 #노개북
    redis
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Debin
Java MetaSpace
상단으로

티스토리툴바