-
Notifications
You must be signed in to change notification settings - Fork 0
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
Comments
🌟시작하며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까지 사용된 메모리 개념으로 주로 다음 내용이 저장된다.
메모리 상의 위치힙 내부에 위치, JVM에 의해서 크기가 강제되던 영역이다. MetaSpace정의Java8부터 JVM의 메모리 영역 중 Permanent Generation 메모리 영역이 사라지고 Metaspace 영역이 생겼다. MetaSpace에는 다음과 같은 내용이 저장된다.
메모리 상의 위치Native Memory 내에 위치하며 JVM이 아니라 커널이 메모리를 관리하기 때문에 메모리 관리 복잡성이 줄어들었다. 간단히 Java 7의 PermGen과 Java 8의 MetaSpace에 대해서 살펴봤다. 다시 한 번 짧게 요약하자면 일단 JVM의 Heap영역에서 관리되던 PermGen과 다르게 MeatSpace는 Native Memory 즉, os에서 관리하는 메모리 영역이 되었다. 그와 동시에 Static Object 변수나 상수, String constant pool은 분리되어 Heap 영역에 포함되게 되었다. 이러한 구조의 변화는 어떤 장점을 가져왔을까? 메모리 관리의 간소화
MaxPermSize는 85,983,232 byte, MaxMetaspaceSize는 18,446,744,073,709,547,520 byte로 물론 둘 다 재설정도 가능하지만 초기 상태에서 가질 수 있는 범위에서 엄청난 차이를 보인다. 즉, 영역 확보의 상한을 크게 의식할 필요가 없어졌다. 이를 통해서 원래 PermGen 영역의 크기 제한을 없애는 효과로 메모리 관리로 인한 어려움을 없애고, OOM(Out of Memory) Error 발생을 줄일 수 있다. Metaspace 외의 메모리 구조
메모리 구조를 보면 Native Memory 내부에 Heap Memoery가 포함되고, 나머지 부분에 Metaspace, stack, codecache가 있는 것을 볼 수 있다. 각각은 다음의 내용을 저장한다.
추가로 살펴보면 좋은 내용서론에서 JVM 작동 방식에 대해서 언급했는데, 이를 좀 더 쉽게 이해하기 위해서는 JVM의 메모리 이외의 JVM 구조를 좀 더 살펴보는 것이 좋을 것 같다. 참고자료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/ |
👍 문제
p.132 에서는 클래스의 메타 데이터 정보가 JVM의
Perm
영역에 저장된다고 서술하고 있다.하지만 Java 8에서는
Perm
영역이 사라지고Metaspace
영역이 등장했다고 한다.해당 변화의 장점과 더불어, 현재의 JVM 메모리 영역의 구성에 대해서 정리해보자.
수업 시간에 언뜻 Perm영역이 사라졌다고 들은 것 같은데. 책에서 언급되어 있어서 궁금증이 생겼다.
이번 기회에 한 번 정리해보면 좋을 것 같아서 선정하였다.
📺 관련 챕터 및 레퍼런스
story07. 클래스 정보, 어떻게 알아낼 수 있나?
🐳 비고
The text was updated successfully, but these errors were encountered: