JAVA8 JVM 메모리 구조는 영구 metaSpace 생성 변경된

기사에서 " 구조의 메모리 JVM을 설명 우리가 Java7 이전의 JVM의 메모리 구조를 설명하지만, Java8의 JVM 나중에 메모리 구조에서 천천히 변화". 당신이 모르는 경우 면접관으로 인터뷰 과정은 약간의 무지는 다시 한 번하지? 면접관, 이러한 변화를 인식하는 경우, 차례로 면접의 하이라이트가된다.

네트워크에서 검색 JVM 메모리 구성이, 90 %는 Java7 이전 메모리 맵에 볼 수 있습니다 경우이 문서는 다시 JVM 메모리 구조의 미세화에 Java8 후 내부 변화에 대한 심층적 인 이해가 될 것입니다. "뉴 호라이즌 프로그램,"바의 공개 수의 이점을 실현 지금보기. 여기에서 당신은 지속적으로 자신의 지식과 인식을 새로 고칠 수 있습니다.

[전송] https://www.choupangxia.com/2019/10/22/interview-jvm-gc-02/

JVM 메모리 구조 세분화

그런 다음 "볼 JVM의 메모리 구조 상세 "메모리 구성도.

JVM 메모리 구조

자세한 설명을 위해, 우리는 더 조정을 최적화하기 위해이 차트를 참조하십시오. java7과 정련의 이전 버전.

JVM 메모리 구조

어떤 변화가 보이십니까? 힙 및 방법 영역이 서로 연결되어 있지만, 힙 및 방법 영역이 함께, 그들은 여전히 ​​논리적으로 분리되어 있다는 말을하지 않습니다. 그러나 실제로 그들은 또한 메모리의 연속 블록이다, 말하기. 즉, 방법 및 에덴의 앞의 영역과 우리는 기존의 연속에 대해 이야기했다.

JVM 메모리 구조

절차를 계속하기 전에, 우리는 먼저 두 개념을 이해 : 규격 및 구현을.

사양 및 구현

규범에 자바 가상 머신 주제의 이행을위한 특별한 "자바 가상 머신 사양은"이 있으며, 다른 업체는 다른 가상 머신의 구현이있다. 개발 과정보다 인터페이스의 정의처럼,이 구현 될 수있는 특정 인터페이스는 다양한 비즈니스 요구에 따라.

PS : 나는있는 공개 문제 "프로그램 뉴 호라이즌은"자바 SE 가상 머신 사양의 PDF 버전 7은 "002"응답하지 "자바 가상 머신 사양,"보고 할 필요가있다.

我们通常使用的Java SE都是由Sun JDK和OpenJDK所提供,这也是应用最广泛的版本。而该版本使用的VM就是HotSpot VM。通常情况下,我们所讲的java虚拟机指的就是HotSpot的版本。

永久代(PermGen)

上面理解了规范和实现之后,来看认识一个概念“永久代(Permanet Generation,也称PermGen)”。对于习惯了在HotSpot虚拟机上开发、部署的程序员来说,很多都愿意将方法区称作永久代。

本质上来讲两者并不等价,仅因为Hotspot将GC分代扩展至方法区,或者说使用永久代来实现方法区。在其他虚拟机上是没有永久代的概念的。也就是说方法区是规范,永久代是Hotspot针对该规范进行的实现。

理解上面的概念之后,我们对Java7及以前版本的堆和方法区的构造再进行一下变动。

JVM 메모리 구조

再重复一遍就是对Java7及以前版本的Hotspot中方法区位于永久代中。同时,永久代和堆是相互隔离的,但它们使用的物理内存是连续的。

永久代的垃圾收集是和老年代捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。

但在Java7中永久代中存储的部分数据已经开始转移到Java Heap或Native Memory中了。比如,符号引用(Symbols)转移到了Native Memory;字符串常量池(interned strings)转移到了Java Heap;类的静态变量(class statics)转移到了Java Heap。

然后,在Java8中,时代变了,Hotspot取消了永久代。永久代真的成了永久的记忆。永久代的参数-XX:PermSize和-XX:MaxPermSize也随之失效。

元空间(Metaspace)

对于Java8,HotSpots取消了永久代,那么是不是就没有方法区了呢?当然不是,方法区只是一个规范,只不过它的实现变了。

在Java8中,元空间(Metaspace)登上舞台,方法区存在于元空间(Metaspace)。同时,元空间不再与堆连续,而且是存在于本地内存(Native memory)。

JVM 메모리 구조

本地内存(Native memory),也称为C-Heap,是供JVM自身进程使用的。当Java Heap空间不足时会触发GC,但Native memory空间不够却不会触发GC。

JVM 메모리 구조

针对Java8的调整,我们再次对内存结构图进行调整。

元空间存在于本地内存,意味着只要本地内存足够,它不会出现像永久代中“java.lang.OutOfMemoryError: PermGen space”这种错误。看上图中的方法区,是不是“膨胀”了。

默认情况下元空间是可以无限使用本地内存的,但为了不让它如此膨胀,JVM同样提供了参数来限制它使用的使用。

  • -XX:MetaspaceSize,class metadata的初始空间配额,以bytes为单位,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当的降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize(如果设置了的话),适当的提高该值。
  • -XX:MaxMetaspaceSize,可以为class metadata分配的最大空间。默认是没有限制的。
  • -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为class metadata分配空间导致的垃圾收集。
  • -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为class metadata释放空间导致的垃圾收集。

永久代为什么被替换了

思考一下,为什么使用元空间替换永久代?

表面上看是为了避免OOM异常。因为通常使用PermSize和MaxPermSize设置永久代的大小就决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到OOM错误。

요소의 공간을 사용하는 경우, 메타 데이터는 매우를 MaxPermSize 더 이상 제어와 같은로드, 사용 가능한 실제 공간의 시스템에 의해 제어 될 수있다.

깊은 이유로하는 JRockit 및 핫스팟 코드를 병합,하는 JRockit 호출되지 영구 생성, 운영 및 유지 보수 직원은 영구 세대 크기의 세트를 개발해야하지만, 잘 실행하지 않습니다. 동시에, 운영 성능 문제를 걱정하지 않으며 테스트, 프로그램까지 1 % 미만으로 속도를 실행하지만, 더 큰 보안에 대한 대가로 이러한 성능 손실을 커버한다.

추천

출처www.cnblogs.com/hanhaotian/p/11724172.html