Java 元空间

作者: 烟雨乱平生 | 来源:发表于2019-10-21 13:55 被阅读0次

metaspace,顾名思义,元数据空间,专门用来存元数据的,它是jdk8里特有的数据结构用来替代perm

metaspace出现背景

我们都知道jdk8之前有perm这一整块内存来存klass等信息,我们的参数里也必不可少地会配置-XX:PermSize以及-XX:MaxPermSize来控制这块内存的大小,jvm在启动的时候会根据这些配置来分配一块连续的内存块,但是随着动态类加载的情况越来越多,这块内存我们变得不太可控,到底设置多大合适是每个开发者要考虑的问题,如果设置太小了,系统运行过程中就容易出现内存溢出,设置大了又总感觉浪费,尽管不会实质分配这么大的物理内存。基于这么一个可能的原因,于是metaspace出现了,希望内存的管理不再受到限制,也不要怎么关注元数据这块的OOM问题,虽然到目前来看,也并没有完美地解决这个问题。

metaspace的组成

  • Klass Metaspace
  • NoKlass Metaspace

Klass Metaspace

Klass Metaspace就是用来存klass的,klass是我们熟知的class文件在jvm里的运行时数据结构,不过有点要提的是我们看到的类似A.class其实是存在heap里的,是java.lang.Class的一个对象实例。这块内存是紧接着Heap的,和我们之前的perm一样,这块内存大小可通过-XX:CompressedClassSpaceSize参数来控制,这个参数前面提到了默认是1G,但是这块内存也可以没有,假如没有开启压缩指针就不会有这块内存,这种情况下klass都会存在NoKlass Metaspace里,另外如果我们把-Xmx设置大于32G的话,其实也是没有这块内存的,因为会这么大内存会关闭压缩指针开关。还有就是这块内存最多只会存在一块。

NoKlass Metaspace

NoKlass Metaspace专门来存klass相关的其他的内容,比如method,constantPool等,这块内存是由多块内存组合起来的,所以可以认为是不连续的内存块组成的。这块内存是必须的,虽然叫做NoKlass Metaspace,但是也其实可以存klass的内容,上面已经提到了对应场景。

Klass Metaspace和NoKlass Mestaspace都是所有classloader共享的,所以类加载器们要分配内存,但是每个类加载器都有一个SpaceManager,来管理属于这个类加载的内存小块。如果Klass Metaspace用完了,那就会OOM了,不过一般情况下不会,NoKlass Mestaspace是由一块块内存慢慢组合起来的,在没有达到限制条件的情况下,会不断加长这条链,让它可以持续工作。


相关文章

  • Java 元空间

    metaspace,顾名思义,元数据空间,专门用来存元数据的,它是jdk8里特有的数据结构用来替代perm met...

  • java基础知识,JVM的运行时数据区

    知识要点: 堆 方法区(元空间) 栈 堆 对于大多数应用来说,Java堆(Heap)是Java虚拟机所管理的内存中...

  • JVM系列五(方法区)

    一.堆、栈、方法区的交互关系 1.1 从线程共享与否角度 【注】元空间是Java8及以后的叫法,Java7及之前是...

  • 元空间

    解释 元空间是jdk1.8之后出现的,之前叫永久代 元空间就是方法区,方法区是JVM的规范,元空间是HotSpot...

  • java8内存结构变化

    java8移除了永久代,增加了元空间。1)java7以前的版本Hotspot的方法区位于永久代,并且永久代和堆是互...

  • Java内存模型深度剖析

    1、Java整体结构与内存模型 堆空间 元空间(方法区) 程序计数器 虚拟机栈 本地方法栈 1)虚拟机栈 一个线程...

  • JVM说明

    1、JVM空间说明 JDK 1.7及以前,java类的信息、常量池、静态变量都存在Permanent中,类的元数据...

  • 1.8 Java 注解annotation

    1.1 注解声明 Java注解Annotation,有声明注解和元注解 元注解:Java提供的元注解,所谓元注解就...

  • Java服务器常用OOM总结

    java.lang.OutOfMemoryError: Java heap space ,表示 Java 堆空间不...

  • java大厂面试题整理(八)JVM内存溢出和垃圾回收机制

    元空间概念 其实说到这还是要简单说下java8、虽然是版本迭代,但是JAVA8相对于之前来说是个大版本的迭代,改了...

网友评论

    本文标题:Java 元空间

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