Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JVM의 메모리 영역은 어떻게 구성되어 있을까? #6

Open
ChoiSeEun opened this issue Sep 16, 2023 · 1 comment
Open

JVM의 메모리 영역은 어떻게 구성되어 있을까? #6

ChoiSeEun opened this issue Sep 16, 2023 · 1 comment
Assignees
Labels
ch7 about chapter7 🚢 week2

Comments

@ChoiSeEun
Copy link
Contributor

👍 문제

p.132 에서는 클래스의 메타 데이터 정보가 JVM의 Perm영역에 저장된다고 서술하고 있다.
하지만 Java 8에서는 Perm 영역이 사라지고 Metaspace 영역이 등장했다고 한다.
해당 변화의 장점과 더불어, 현재의 JVM 메모리 영역의 구성에 대해서 정리해보자.

✈️ 선정 배경

수업 시간에 언뜻 Perm영역이 사라졌다고 들은 것 같은데. 책에서 언급되어 있어서 궁금증이 생겼다.
이번 기회에 한 번 정리해보면 좋을 것 같아서 선정하였다.

📺 관련 챕터 및 레퍼런스

story07. 클래스 정보, 어떻게 알아낼 수 있나?

🐳 비고

@ChoiSeEun ChoiSeEun added 🚢 week2 ch7 about chapter7 labels Sep 16, 2023
@daminzzi daminzzi self-assigned this Sep 18, 2023
@daminzzi
Copy link
Member

daminzzi commented Sep 19, 2023

🌟시작하며

Java는 플랫폼에 의존적이지 않다. 하지만 Java를 실행 파일로 만들기 위해서는 컴파일 후 class 파일을 자신의 플랫폼에 맞는 JVM(Java Virtual Machine)위에서 실행시켜야 한다. JVM의 동작 방식은 다음과 같다.

1. 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당한다.

2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일.

3. Class Loader를 통해 JVM Runtime Data Area로 로딩.

4. Runtime Data Area에 로딩 된 .class들은 Execution Engine을 통해 해석.

5. 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Execution Engine에 의해 GC의 작동, 스레드 동기화가 이루어짐.

이러한 과정 속에서 벌써 여러 구조의 이름이 등장했는데, JVM은 여러 기능을 수행하기 위해서 복잡한 구조를 가지게 된다. 우리는 그 중에서 JVM의 메모리 영역에 집중해, 자바 7에서 자바 8로 넘어갈 때의 변화와 지금의 구조에 대해서 살펴보자.


PermGen과 MetaSpace 비교

PermGen

정의

Java7까지 사용된 메모리 개념으로 주로 다음 내용이 저장된다.

  • Class, method의 메타데이터, Static Object 변수, 상수 등
  • String Constant Pool(Java 6까지는 Perm에 저장됐는데, Java7부터는 Heap에 저장됐다고 함)

메모리 상의 위치

java7jvm

힙 내부에 위치, JVM에 의해서 크기가 강제되던 영역이다.

MetaSpace

정의

Java8부터 JVM의 메모리 영역 중 Permanent Generation 메모리 영역이 사라지고 Metaspace 영역이 생겼다. MetaSpace에는 다음과 같은 내용이 저장된다.

  • class, method 메타 데이터
  • static object 변수나 상수, String Constant pool 미포함

메모리 상의 위치

java8jvm

Native Memory 내에 위치하며 JVM이 아니라 커널이 메모리를 관리하기 때문에 메모리 관리 복잡성이 줄어들었다.

간단히 Java 7의 PermGen과 Java 8의 MetaSpace에 대해서 살펴봤다. 다시 한 번 짧게 요약하자면 일단 JVM의 Heap영역에서 관리되던 PermGen과 다르게 MeatSpace는 Native Memory 즉, os에서 관리하는 메모리 영역이 되었다. 그와 동시에 Static Object 변수나 상수, String constant pool은 분리되어 Heap 영역에 포함되게 되었다. 이러한 구조의 변화는 어떤 장점을 가져왔을까?


메모리 관리의 간소화

  • JVM의 메모리는 원래 Heap과 PermGen의 영역을 모두 관리했는데, Metaspace가 분리되어 Native 메모리 영역으로 넘어가게 되었다.
  • 따라서 메모리 영역 확보의 상한을 크게 의식할 필요가 없어졌다.
  • java 7을 이용할 때의 MaxPermSize와 java 8을 이용할 때의 MaxMetaspaceSize를 비교해보면

maxpermsize

maxmetaspacesize

MaxPermSize는 85,983,232 byte, MaxMetaspaceSize는 18,446,744,073,709,547,520 byte로 물론 둘 다 재설정도 가능하지만 초기 상태에서 가질 수 있는 범위에서 엄청난 차이를 보인다. 즉, 영역 확보의 상한을 크게 의식할 필요가 없어졌다.

이를 통해서 원래 PermGen 영역의 크기 제한을 없애는 효과로 메모리 관리로 인한 어려움을 없애고, OOM(Out of Memory) Error 발생을 줄일 수 있다.


Metaspace 외의 메모리 구조

memory
이해를 쉽게 하기 위한 자료를 찾는데 상당히 많은 시간을 할애함..

메모리 구조를 보면 Native Memory 내부에 Heap Memoery가 포함되고, 나머지 부분에 Metaspace, stack, codecache가 있는 것을 볼 수 있다.

각각은 다음의 내용을 저장한다.

  • Heap
    • 객체, 상수 풀을 저장하기 위한 영역
    • Thread에 의해 공유
    • 객체가 생성되고 G.C에 의해 정리됨
  • Stack
    • 메서드들의 실행 공간
    • thread별로 별도 관리
    • 메서드 호출 시 마다 메서드 프레임 적층
    • 메서드 프레임에 로컬 변수도 쌓이는 구조
  • Metaspace
    • 클래스(type, field, method) 정보 처리
  • Codecache
    • JIT(Just-In-Time)에서 바이트 코드를 네이티브 코드로 컴파일하여 저장하는데 사용.

추가로 살펴보면 좋은 내용

서론에서 JVM 작동 방식에 대해서 언급했는데, 이를 좀 더 쉽게 이해하기 위해서는 JVM의 메모리 이외의 JVM 구조를 좀 더 살펴보는 것이 좋을 것 같다.
참고하면 좋은 자료(https://velog.io/@ditt/JavaJVM-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD)

참고자료

https://johngrib.github.io/wiki/java8-why-permgen-removed/#왜-perm이-제거됐고-metaspace-영역이-추가된-것인가

https://velog.io/@xogml951/PermGenJAVA7-VS-MetaSpaceJAVA8

https://jaemunbro.medium.com/java-metaspace에-대해-알아보자-ac363816d35e

https://sergiomartinrubio.com/articles/java-memory-model-overview/

https://openjdk.org/jeps/122


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ch7 about chapter7 🚢 week2
Projects
None yet
Development

No branches or pull requests

2 participants