介绍JVM的内存模型的博客:https://blog.csdn.net/q5706503/article/details/84614158

JDK8 HotSpot JVM 将移除永久区,使用本地内存来存储类元数据信息并称之为:元空间(Metaspace)

以下是JVM内存模型中方法区的变动

1.新生代:Eden+From Survivor+To Survivor

2.老年代:OldGen

3.永久代(方法区的实现) : PermGen----->替换为Metaspace(本地内存中)

方法区和“PermGen space”又有着本质的区别。前者是 JVM 的规范,而后者则是 JVM 规范的一种实现,并且只有 HotSpot 才有 “PermGen space”,而对于其他类型的虚拟机,如 JRockit(Oracle)、J9(IBM) 并没有“PermGen space”。由于方法区主要存储类的相关信息,所以对于动态生成类的情况比较容易出现永久代的内存溢出

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

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

 除了上面两个指定大小的选项以外,还有两个与 GC 相关的属性
  -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集
  -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集

《Java虚拟机规范(JavaSE7)》中也说了方法区是堆的逻辑组成部分。 
实际上JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。但永久代在JDK1.8才被移除

移除永久代的影响

由于类的元数据分配在本地内存中,元空间的最大可分配空间就是系统可用内存空间。因此,我们就不会遇到永久代存在时的内存溢出错误,也不会出现泄漏的数据移到交换区这样的事情。最终用户可以为元空间设置一个可用空间最大值,如果不进行设置,JVM会自动根据类的元数据大小动态增加元空间的容量。

注意:永久代的移除并不代表自定义的类加载器泄露问题就解决了。因此,你还必须监控你的内存消耗情况,因为一旦发生泄漏,会占用你的大量本地内存,并且还可能导致交换区交换更加糟糕。

元空间内存管理

元空间的内存管理由元空间虚拟机来完成。先前,对于类的元数据我们需要不同的垃圾回收器进行处理,现在只需要执行元空间虚拟机的C++代码即可完成。在元空间中,类和其元数据的生命周期和其对应的类加载器是相同的。话句话说,只要类加载器存活,其加载的类的元数据也是存活的,因而不会被回收掉。

准确的来说,每一个类加载器的存储区域都称作一个元空间所有的元空间合在一起就是我们一直说的元空间。当一个类加载器被垃圾回收器标记为不再存活,其对应的元空间会被回收。在元空间的回收过程中没有重定位和压缩等操作。但是元空间内的元数据会进行扫描来确定Java引用。

元空间虚拟机负责元空间的分配,其采用的形式为组块分配。组块的大小因类加载器的类型而异。在元空间虚拟机中存在一个全局的空闲组块列表。当一个类加载器需要组块时,它就会从这个全局的组块列表中获取并维持一个自己的组块列表。当一个类加载器不再存活,那么其持有的组块将会被释放,并返回给全局组块列表。类加载器持有的组块又会被分成多个块,每一个块存储一个单元的元信息。组块中的块是线性分配(指针碰撞分配形式)。组块分配自内存映射区域。这些全局的虚拟内存映射区域以链表形式连接,一旦某个虚拟内存映射区域清空,这部分内存就会返回给操作系统。

运行时常量池在JDK1.6及之前版本的JVM中是方法区的一部分,而在HotSpot虚拟机中方法区放在了”永久代(Permanent Generation)”。所以运行时常量池也是在永久代的。 
但是JDK1.7及之后版本的JVM已经将字符串常量池从方法区中移了出来,在Java 堆(Heap)中开辟了一块区域存放字符串常量池

String.intern()是一个Native方法,它的作用是:如果运行时常量池中已经包含一个等于此String对象内容的字符串,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此String内容相同的字符串,并返回常量池中创建的字符串的引用

变动原因:

  • 字符串存在永久代中,现实使用中易出问题, 由于永久代内存经常不够用或发生内存泄露,爆出异常                                    java.lang.OutOfMemoryError: PermGen
  • 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。
  • 永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。
  • This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation.
  • 即:移除永久代是为融合HotSpot JVM与 JRockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代。

JVM 1.8 永久代---元空间 的变动相关推荐

  1. 直接内存与元空间_深入浅出 JVM 内存管理

    Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗? 可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义 | 有哪些GC算法 以及年轻代和老年代各自特点等等.1 ...

  2. java年轻代minor gc_jvm之年轻代(新生代)、老年代、永久代以及GC原理详解、GC优化...

    关于JVM,也许你听过这些术语:年轻代(新生代).老年代.永久代.minor gc(young gc).major gc.full gc 不要急,先上图,这是jvm 堆内存结构图 仔细的你发现了 图中 ...

  3. 永久代退出舞台,元空间腾空出世

    文章目录 一.前言 二.元空间由来和本质 2.1 元空间的诞生与永久代的消失 2.2 从永久代到元空间 2.2.1 JDK8之前,永生代在哪里? 2.2.2 JDK8之后,永生代废弃,元空间诞生 2. ...

  4. JVM年轻代,老年代,永久代详解

    前言 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.本篇文章主要讲解内存区域的年轻代,老年代和永久代,略微提及一些垃圾回收算法,下面是正文. 堆整体 堆主 ...

  5. AVA 8 :从永久区(PermGen)到元空间(Metaspace)

    你注意到了吗?JDK 8早期可访问版本已经提供下载了,java 开发人员可以使用java 8 提供的新的语言和运行特性来做一些实验.其中一个特性就是完全的移除永久代(Permanent Generat ...

  6. 深入理解Java虚拟机(三)之详拆运行时数据区的各个结构----方法区(元空间)

    目录 栈.堆.方法区的交互关系 方法区的理解 设置方法区的大小和OOM 方法区的内部结构 存放内容 类型信息 域信息 方法(Method)信息. 静态变量 常量(static final) 运行时常量 ...

  7. Java中元空间解析

    方法区Method元空间 主要是存储类信息 线程共享 JVM启动时才能被创建,可以在物理空间上不连续 系统定义太多的类可能会导致方法区溢出----->OOM(比如:加载大量第三方Jar包:tom ...

  8. 永久代java_JAVA8永久代

    在Java虚拟机(以下简称JVM)中,类包含其对应的元数据,比如类的层级信息,方法数据和方法信息(如字节码,栈和变量大小),运行时常量池,已确定的符号引用和虚方法表. 在过去(当自定义类加载器使用不普 ...

  9. java7永久代在哪_Java永久代去哪儿了

    在Java虚拟机(以下简称JVM)中,类包含其对应的元数据,比如类的层级信息,方法数据和方法信息(如字节码,栈和变量大小),运行时常量池,已确定的符号引用和虚方法表. 在过去(当自定义类加载器使用不普 ...

最新文章

  1. 提防iostream使用中的一个“陷阱”
  2. nginx限制ip,只允许域名访问
  3. 基础的VueJS面试题(附答案)
  4. async function_Electron IPC 通信如何使用 async/await 调用?
  5. .net 获取字符串中的第一个逗号的位置_SQLZOO中做错过的题
  6. themleft模板库_Thymeleaf模板引擎常用总结
  7. spring mvc学习(14) the superclass “javax.servlet.http.HttpServlet” was not found
  8. Arrays工具类常见方法
  9. 灼灼夏日 - 遥思故乡 - 赤子无相忘
  10. C++学习之路 | PTA乙级—— 1018 锤子剪刀布 (20分)(精简)
  11. HTML DOM教程 36-HTML DOM Link 对象
  12. mac python 图_Python之图片OCR识别(Mac)
  13. php中ob函数的用法
  14. [渝粤教育] 苏州科技大学 混凝土结构设计原理 参考 资料
  15. 饱受诟病的白板面试,为什么沿用至今?
  16. Vim终极指南:所思即所得
  17. 基于搜狗微信爬取微信公众号的文章
  18. python将多个列表合并_Python将多个list合并为1个list的方法
  19. Django中F对象,Q对象与运算符
  20. DIY 3D打印机——【有啥用啥版】

热门文章

  1. jQuery的promise异步模式
  2. 主板显卡服务器维修,显卡无显示怎么维修 显卡无显示解决方法【详细介绍】...
  3. 技术大佬都在看的几个公众号
  4. 自动跟随小车c语言,智能小车跟随系统的设计与制作.doc
  5. try/catch 的解释与用法
  6. 2021年中国VR/AR行业市场投融资现状分析:VR/AR技术领域融资实现双增长[图]
  7. 机械硬盘通过USB外接到电脑,显示不出来
  8. 使用邮箱教学|邮箱是什么?办公中是怎么使用的
  9. Java格式化字符串
  10. 嵌入式C语音基础夯实备用实战