NDM

[Java] Java8 MetaSpace 본문

Java

[Java] Java8 MetaSpace

ndm.jr 2022. 8. 5. 14:48

https://ndm-tech.tistory.com/3

 

[Java] 자바 동작 원리와 JVM 2편 : Runtime Data Area

목차 Runtime Data Area Prior Java 8 After Java 8 Runtime Data Area 프로그램 수행을 위해 할당받은 공간. 자바 메모리 공간이라고도 불림 Method Area ( Java 8 이전 ) Non-Heap 공간. Permanent를 차지하는..

ndm-tech.tistory.com

에서 Java Runtime Area에 대해 정리했습니다

 

다만, GC를 알아보기에 앞서 정확히 Java8 이전과 이후를 볼 때, MetaSpace 영역이 추가됨으로써

 

한눈에 정리되지 않는 느낌이 들어 다시한번 정리하고자 합니다

 

자세한건 위 포스팅을 참고해주시고, 이번 포스팅에서는 GC를 알아보는게 목적이므로

 

Java8을 기준으로 어떻게 바뀌었는지에 대해서만 간략하게 알아보고 넘어가겠습니다

 


Java 8 Metaspace

Java8 에서는 MetaSpace라는 영역이 추가되었습니다.

 

엄밀히 말하면 추가되었다기 보다는, Java8 이전에 Method Area라는 영역이 있었죠

 

 

여기서 Method Area는

  • 클래스, 인터페이스, 객체 구조, 메소드 등등 의 메타데이터
  • Runtime 상수 풀
  • Static 관련 정보

들을 관리하는 공간이었죠. 여기서 하나만 더 들어가보겠습니다 Permanent Generation이라는 영역입니다

 

 

 

 

 

Permanent Generation(Permgen)을 Method Area 동등하게 보는 글들이 많지만, 이는 사실이 아닙니다

 

Permanent Generation이라는 영역의 하위 집합에 Method Area가 들어있는 것이죠

 

 

저 Permanent Generation 공간 안에 Method Area가 위치하고, Heap에 속하지 않기 때문에

 

Static 관련 데이터가 늘어날 수록 OOM의 위험도도 증가했습니다. Permsize옵션을 통해 따로 늘려줘야 해요.

 

여기까지는 Jdk 1.7 까지의 구조입니다. Java8에서 MetaSpace가 도입되고 어떻게 변했을까요??

 

 

Permanent Generation 공간이 사라지고, MetaSpace라는 영역이 추가되었습니다. 자세히 볼게요

 

MetaSpace는 Non-heap 영역에 할당이 되어 있습니다. 즉, JVM이 아닌 OS로부터 영역을 자동으로 할당받습니다.

 

그럼 Method Area는 어디로 갔을까요??

 

 

Java8 부터는 MethodArea를 MetaSpace가 완전히 대체한다는 내용이며,

 

Method Area에서 관리하던 데이터 중

 

Class의 메타데이터는 Native Area로, static 변수, 메소드, 레퍼런스들은 Heap 영역으로 할당된다는 내용이죠.

 

 

 

즉, 정리하면

 

  1. Java8 이전에는 클래스 메타데이터와 Static관련 데이터, 런타임 상수 풀을 Method Area라는 Permanent Generation의 하위 집합에서 관리
  2. Java8 이후 Native Area에 MetaSpace라는 공간이 추가되었고, Permanent Generation이 MetaSpace로 대체되며 클래스 메타데이터는 Native Area인 MetaSpace에서, Static 데이터는 Heap 영역에서 관리(Rerence는 MetaSpace에서 관리)

 


결과

 

Java8을 기준으로 이전과 이후의 Runtime Data Area에 대해 살펴보았습니다.

 

그럼 이러한 변화는 어떤걸 의미하는 걸까요?

 

  1. JVM에서 관리하던 Permanent Generation을 OS가 자동으로 관리하도록 바뀌며, 직접적으로 할당할 필요가 없이 계속해서 늘어나 개발자는 이 부분에 대해 고민할 필요가 없어졌습니다
  2. Static데이터가 Heap에 들어감에 따라, Static도 GC의 대상이 될 수 있습니다
  3. 이전에는 Permanent Generation 영역에서 메모리 부족으로 인해 OOM이 발생하는 상황이 많았다고 합니다. 이제부터는 Xmx(Heap메모리최대치옵션) + MaxMetaSpace + NIO를 통해 Native Memory를 직접 할당받는 크기까지 고려해서 메모리를 할당해야 OOM에서 최대한 벗어날 수 있을 것입니다.

참조

 

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

 

Java 8에서 JVM의 변화 : PermGen이 사라지고 Metaspace가 등장하다.

Index

goodgid.github.io

 

 

[Java Memory Profiling에 대하여] ② 메모리 모니터링과 원인분석

[BY 삼성SDS] 이어서앞선 글에서 Java의 메모리 구조와 OOME가 발생하는 케이스에 대해 알아보았다면,...

m.post.naver.com

https://jgrammer.tistory.com/144

 

[JAVA] Java8부터는 static이 heap영역에 저장된다?

static은 런타임시 클래스 로더에 의해 메서드 영역에 적재되며 프로그램이 종료될 때 까지 GC에 대상이 아니라고 알고있었다. 그런데, permanent영역과 metaspace에 관련된 글을 읽는 중 static이 heap영

jgrammer.tistory.com

https://goodgid.github.io/Java-8-JVM-Metaspace/ https://www.samsungsds.com/kr/insights/1232761_4627.html

 

[Java Memory Profiling에 대하여] 1. JVM 메모리의 이해와 케이스 스터디

[Java Memory Profiling에 대하여] 1. JVM 메모리의 이해와 케이스 스터디

www.samsungsds.com

https://tecoble.techcourse.co.kr/post/2021-08-09-jvm-memory/