美文网首页java基础
Java 8 内存划分

Java 8 内存划分

作者: Candy有雪吃 | 来源:发表于2018-07-31 10:18 被阅读0次

都知道java8移除了永久代,其实,移除永久代的工作从JDK1.7就开始了。JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。但永久代仍存在于JDK1.7中,并没完全移除,譬如符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap。

元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制,但可以通过参数来指定元空间的大小。

为什么要将永久代替换成Metaspace?可能的原因有:

1、字符串存在永久代中,容易出现性能问题和内存溢出。

2、类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。

3、永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。

4、Oracle 可能会将HotSpot 与 JRockit 合二为一。

java8内存模型图

1.在 JDK 1.7 和 1.8 中将字符串常量池由永久代转移到堆中

2.存放类相关信息的地方也不在heap(堆)中。在元空间里。

3.在jdk1.8中没有永久代的概念,

4.metaspace其实由两大部分组成

● Klass Metaspace

存放klass的,klass是我们熟知的class文件在jvm里的运行时数据结构,这个空间的默认大小是1G

● NoKlass Metaspace

专门来存klass相关的其他的内容,比如method,constantPool(常量池)等,这块内存是由多块内存组合起来的,所以可以认为是不连续的内存块组成的。这块内存是必须的

● Klass Metaspace和NoKlass

Mestaspace都是所有classloader共享的,所以类加载器们要分配内存,但是每个类加载器都有一个SpaceManager,来管理属于这个类加载的内存小块。如果Klass

Metaspace用完了,那就会OOM了,不过一般情况下不会,NoKlass

Mestaspace是由一块块内存慢慢组合起来的,在没有达到限制条件的情况下,会不断加长这条链,让它可以持续工作。

5.metaspace主要相关参数

-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。

-XX:MaxMetaspaceSize,最大空间,默认是没有限制的。

-XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集

-XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集

相关文章

  • Java虚拟机内存管理

    Java内存区域 详细的描述在下面的文章中都说过,不在赘述《Java内存区域划分》 (Java8之前,Java8已...

  • Java 8 内存划分

    都知道java8移除了永久代,其实,移除永久代的工作从JDK1.7就开始了。JDK1.7中,存储在永久代的部分数据...

  • 好好看,好好学

    Java部分 面向对象 java 内存JVM:图文解析 Java内存结构Java虚拟机内存管理——内存空间划分Ja...

  • 图解JVM的五个区域

    Java程序执行流程: 谈一谈Java内存区域的划分实际上是指JVM内存区域的划分,首先Java先介绍一下Java...

  • Java虚拟机内存管理知识总结

    0、Java 对内存的划分: Java虚拟机规范将物理内存(主内存和CPU中的缓存、寄存器)划分为 程序计数器 、...

  • Java 内存划分

    当程序运行时在内存中开辟空间 当程序完成结束后内存空间被释放,将不占用内存空间.

  • Java内存划分

    java内存被划分成5个部分 栈内存(Stack):存放的都是方法中的局部变量,方法的运行一定是在栈当中局部变量:...

  • Java内存划分

    Java的内存需要划分成为五部分: 1、栈(Stack):存放的都是方法中的局部变量,方法的运行一定要在栈中运行。...

  • JVM基本知识-内存结构

    JVM的内存结构 jdk8 jvm说明根据oracle官方文档的描述,可以总结JVM运行时内存的划分 Java虚拟...

  • 「Android 学习计划」之 JVM 垃圾回收策略

    1. 了解下 Java 中内存区域的划分 Java 虚拟机在执行 Java 程序的过程中,会把它所管理的内存划分为...

网友评论

    本文标题:Java 8 内存划分

    本文链接:https://www.haomeiwen.com/subject/qrycvftx.html