在Java8和以后版本中JVM的内存结构慢慢发生了变化。

如果在网络上搜索JVM内存结构,90%的可能会搜到Java7及以前的内存图,本篇文章将会对JVM内存结构再次细化,深入理解Java8之后内部的变化。

JVM内存结构的细化 再来看一下JVM内存结构图。

为了更细化的讲解,我们将该图进行进一步的优化调整。针对java7及以前版本的细化。

看出变化了吗?堆和方法区连在了一起,但这并不能说堆和方法区是一起的,它们在逻辑上依旧是分开的。但在物理上来说,它们又是连续的一块内存。也就是说,方法区和前面讲到的Eden和老年代是连续的。

在继续进行下去之前,我们先来理解两个概念:规范和实现。

规范和实现

针对Java虚拟机的实现有专门的《Java虚拟机规范》,在遵守规范的前提下,不同的厂商会对虚拟机进行不同的实现。 就好比开发的过程中定义了接口,具体的接口实现大家可以根据不同的业务需求进行实现。

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

永久代(PermGen)

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

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

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

再重复一遍就是对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)。

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

针对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控制, 而由系统的实际可用空间来控制。

更深层的原因还是要合并HotSpot和JRockit的代码,JRockit从来没有所谓的永久代,也不需要开发运维人员设置永久代的大小,但是运行良好。同时也不用担心运行性能问题了,在覆盖到的测试中, 程序启动和运行速度降低不超过1%,但是这点性能损失换来了更大的安全保障。

JVM 为什么使用元空间替换了永久代?相关推荐

  1. 面试官 | JVM 为什么使用元空间替换了永久代?

    7:40到11:40历时4个小时完成了该文,看到电脑中左边的便签了么,我也是拼了. 在Java8和以后版本中JVM的内存结构慢慢发生了变化.作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为 ...

  2. JVM原理系列--元空间(MetaSpace)与永久代(PermGen)的区别

    原文网址:JVM原理系列--元空间(MetaSpace)与永久代(PermGen)的区别_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍JVM中元空间(MetaSpace)与永久代(PermG ...

  3. JVM运行时数据区域——为什么jdk8用元空间替换了永久代

    以局部窥全局,这个问题其实很复杂,要弄清楚这个问题,首先要对JVM运行时数据区域划分以及各个数据区域的作用了和指掌. JVM运行时数据区域总览 JVM在执行Java程序的过程中(简称运行时)会把它所管 ...

  4. jvm的新生代、老年代、永久代关系

    原文地址:https://blog.csdn.net/iechenyb/article/details/79424974 新生代分为三个区域,一个Eden区和两个Survivor区,它们之间的比例为( ...

  5. jvm系列二:Java8内存模型-永久代(PermGen)和元空间(Metaspace)

    原文地址:https://www.cnblogs.com/paddix/p/5309550.html 一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地 ...

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

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

  7. JVM:永久代 以及jdk1.8为什么将其移除?

    永久代 在JDK8之前的HotSpot实现中,类的元数据如方法数据.方法信息(字节码,栈和变量大小).运行时常量池.已确定的符号引用和虚方法表等被保存在永久代中,32位默认永久代的大小为64M,64位 ...

  8. Java当中jvm运行时区域新生代、老年代、永久代和Garbage Collection垃圾回收机制【杭州多测师】【杭州多测师_王sir】...

    1.本地方法栈和程序计数器 ==>偏底层一般不会接触到 2.方法区 ==>对应为永久代 3.虚拟机栈(stack) ==>对应为栈 4.堆(heap) ==>对应里面有新生代+ ...

  9. java8之元空间(Metaspace)

    java里面垃圾回收效果最差的是永久代,而且永久代溢出也是一个非常常见的问题,从java7开始,原来存储于永久代的数据就不断的被移到其他位置,有不少数据都移动到了堆区,比如字符串常量池挪到了堆区,在j ...

  10. java8的元空间到底存储了什么?

    java8中移除了永久带,新增了元空间的概念.JVM加载类的时候,需要记录类的元数据,这些数据会保存在一个单独的内存区域中,在java7里,这个空间被称为永久代,在java 8里,使用元空间代替了永久 ...

最新文章

  1. 智能车竞赛技术报告 | 智能车视觉 - 新余学院 - 开放艺术队
  2. 开发手记之-在Winform中为ListBox的添加选项值,并增加双击事件
  3. AJAX实用教程——获取博客园博文列表
  4. OFDM资料(待总结)
  5. VM : linux虚拟机上挂在U盘
  6. 比特币网站Flexcoin遭黑客攻击 损失极大 被迫关闭
  7. 1.1确定分数与浮点数值之间的近似相等性。
  8. RAW-socket
  9. 单片机c语言程序翻译软件,单片机音乐盒翻译小程序MusicEncode软件下载
  10. MySQL单元三试题与答案_2016年3月三级MySQL数据库试题及答案
  11. Oracle11g补丁安装(单实例)
  12. 微信公众号-网页内实现微信支付
  13. api 接口响应数据格式有哪些
  14. 最近在搞TAM TIM
  15. linux中的find查找文件或者目录、locate快速定位文件路径
  16. python做值班表_如何用Python 实现自动排班
  17. Arista携手思科、瞻博网络 计划打造面向云的交换与路由设备
  18. Windows循环渐进-Ping程序实现代码
  19. Vmare horizon client 5.0安装过程中自动取消
  20. 计算机算法项目经验例子,算法工程师岗位项目经验范文

热门文章

  1. kill word out e ef en em
  2. msdn.itellyou.cn-------sql server下载网站
  3. 2019 秋季最新最全面 JAVA 面试题 附答案
  4. 智能门锁电路图_智能门锁原理图,智能锁工作原理科普
  5. elasticsearch操作索引库、RestClient操作索引库2
  6. CSS为字体添加过度色
  7. orcad 连mysql_如何在OrCAD中建立电气互连
  8. IDEA设置版权信息
  9. c语言中fabs是什么意思,c语言fabs是什么意思_后端开发
  10. 谁偷了我的1天,JSON格式化时区问题