해결된 질문
작성
·
866
1
안녕하세요! JVM 메모리구조를 최근에 공부하면서 생긴 궁금증이 있어 질문을 드리고자 합니다.
Metaspace 영역에서는 Class와 Method, Static 변수들에 대한 메타데이터를 가지고 있다고 알고 있는데, 이는 Method 영역의 역할과 겹치는 것 같습니다. Method 영역 내에 Metaspace 영역이 존재하는 걸까요?
Spring 프레임워크를 사용하다보면, 수 많은 요청에 대해 Reflection을 사용하게 되고 이는 Metaspace에 부하를 줄 수 있다고 하셨습니다. 하지만 특정 A 클래스를 동적으로 로딩하면 최초 한 번에 한해서만 Metaspace에 메타데이터를 저장할 것이고, 이후에는 추가적으로 해당 클래스에 대한 메타데이터를 중복해 저장하지 않는데 어느 포인트에서 성능이 저하되는지 궁금합니다.
위와 같은 개념들을 아무리 찾아봐도 나오지 않아서 선생님께 여쭤보고 싶었습니다. 올려주신 강의와 유튜브 영상 항상 잘 보고 있습니다. 감사합니다 :)
답변 1
0
반대로 생각해야 합니다. Metaspace 영역 안에 기존 Method 영역이 통합되어 포함된 것입니다.
1번에 대한 답변으로 이 문제도 어느 정도 이해가 되리라 생각합니다.
추가적인 이야기를 하자면...
Metaspace는 OS native 메모리를 직접 사용하며 자동으로 크기를 증가 시킬 수 있습니다. 이 때문에 Spring 프레임워크가 사용하는 Reflection에 의한 메모리 이슈가 해결된 것입니다.
Java Reflection으로 객체가 동적 생성되면 클래스가 로드 되면서 클래스에 관한 메타 데이터들은 당연히 캐싱 됩니다. 성능 저하의 핵심은 메모리 보다 동적 로드 그 자체에 있습니다. 그 중 가장 큰 문제는 사전 최적화가 어렵다는 것입니다. 물론 한 번 캐싱 되면 이후로는 최적화 가능성이 있어 속도는 빨라질 수 있겠습니다.
메모리를 효율적으로 사용하지 못해 발생하는 성능 이슈는 메모리 Leak에 따른 문제와 유사하게 생각하면 되겠습니다.
제 구독자시군요. 반갑습니다.
앞으로도 열심히 영상 + 강의 만들도록 하겠습니다. :)