인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

‍이신광님의 프로필 이미지

작성한 질문수

기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM

JVM 힙 영역과 GC

Metaspace에 대한 질문

해결된 질문

작성

·

15

0

안녕하세요 널널한개발자님

 

수업들으면서 많은 것을 배우고 있습니다!

 

다름이 아니고 Method Area 수업에서는 Method Area가 Java 8부터는 PermGen에서 Metaspace에 속하게 되고, JVM Heap 영역이 아니라 Native Memory에서 관리한다고 배웠는데

 

JVM Heap 영역 수업에서 영구 세대(Metaspace)가 같은 것을 지칭하는 것일까요? 제가 보기에는 같은 것을 지칭하는 것 같다고 생각합니다. 그러면 Meataspace는 더 이상 Heap 영역에서 관리하지 않기 때문에 GC로 제거가 되지 않는 것이 맞을까요?

 

또한 저는 처음에 PermanentGen = Method Area라고 생각했는데 그게 아니라 Permanent 영역이 Method Area 영역을 포괄하는 큰 영역이기 때문에

Java 8 이전: PermentGen에 포함된 MethodArea까지 GC가 관리(full시)

Java 8 이후: MethodArea가 PermGen인 Heap 영역에서 분리되었으니 더이상 GC 관리 X 다만 다른 PermGen 영역만 full gc때 관리

라고 생각하면 될까요?

 

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

좋은 세상입니다. 요즘은 AI 답변이 제공이 되니까요. AI 답변과 더불어 제 답변도 함께 올려드립니다.

메서드 영역은 Java 8부터는 Metaspace 영역과 힙 영역을 둘로 분리 되어 관리됩니다. 대표적으로 정적 변수와 Constant pool은 힙 영역에 존재합니다. 그외 메타 데이터 및 메서드 관련 정보는 Metaspace에 저장됩니다.

Metaspace가 사실상 영구 세대 역할을 수행하긴 하지만 그렇다고 GC가 아예 수행되지 않는 것은 아닙니다. 사용하지 않는 클래스에 대한 메타 데이터들은 회수 대상이 됩니다. 이는 클래스가 언로드 될 때 발생하는 일입니다. 물론 자주 발생하는 일은 아닙니다. 참고하시기 바랍니다. 😄

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 이신광님, 인프런 AI 인턴입니다.

Metaspace와 관련하여 질문을 주셔서 감사합니다.

자바 8부터 PermGen(Permanent Generation)이 Metaspace로 대체된 것은 잘 알고 계시네요. 이를 통해 자바에서 메모리 관리가 더 유연해졌습니다. Metaspace는 네이티브 메모리를 사용하기 때문에, 운영 체제에 따라 확장이 가능하며, 한계에 더 적은 영향을 받습니다. 이 부분은 Heap 메모리와는 다르며, JVM에서 직접 관리되지 않고 운영 체제에 의해 관리됩니다.

  1. Metaspace와 Method Area:

    • Metaspace가 Method Area를 포함합니다. 즉, 클래스 메타데이터, 메서드 정보 등이 Metaspace에 저장됩니다.
    • Java 8 이후로는 Method Area가 PermGen 대신 Metaspace에 존재하게 되므로, Heap이 아니라 네이티브 메모리에 관리됩니다.
  2. Garbage Collection:

    • Metaspace는 기본적으로 운영 체제 메모리를 사용하기 때문에, 전통적인 GC에 의해 자동으로 관리되지 않습니다.
    • 그러나 Metaspace에서 메모리가 확보되지 않는 경우, 필요에 따라 JVM이 메모리를 수집하고 정리하려고 시도할 수 있습니다. 메모리를 자동으로 정리하는 GC와는 차이가 있습니다.
  3. 기타 메모리 관리 관점:

    • Java 8 이전에는 PermGen이 Method Area를 포함하므로, 가비지 콜렉션과 관련된 제어를 받을 수 있었습니다.
    • Java 8 이후에는 메타데이터 자체가 Heap에 포함되지 않습니다. JVM 옵션으로 -XX:MaxMetaspaceSize 등을 설정하여 메타스페이스 크기를 제한할 수 있습니다.

관련된 질문들이나 더 구체적인 설명을 원하신다면, 아래 링크들을 참고하시기 바랍니다:
- Metaspace에 대한 깊이 있는 설명
- Metaspace와 Method Area의 관계

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

‍이신광님의 프로필 이미지
‍이신광
질문자

그럼 자바 8 이전에 PemGen이 Method Area를 포함하는 거라면? Method Area를 제외한 PemGen 영역에는 무엇이 저장되나요?

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

대댓글은 AI가 답변하지 않으므로 제가 답변해드립니다.

Java7에서 PermGen에 저장되는 정보는 클래스 메타데이터, 바이트코드, 런타임 상수 풀(스트링 풀 포함), 정적 변수, JIT 컴파일러가 최적화한 메서드 정보 및 컴파일된 코드 정보 등이 있습니다. 참고하시기 바랍니다. 😄