JVM之 永久代与元空间

在介绍永久代之前我们要先来回顾一下我们的JVM内存模型

在JVM中场被提到的有栈,堆,方法区。除了这些其中还包括有我们不常提到的本地方法栈,以及程序计数器。

程序计数器

这是一块较小的内存空间,可看作当前线程正在执行的字节码的行号指示器。如果当前线程正在执行的是:
Java方法
计数器记录的就是当前线程正在执行的字节码指令的地址
本地方法
那么程序计数器值为undefined

Java虚拟机栈(JVM Stack)

相对于基于寄存器的运行环境,JVM是基于栈结构的运行环境。栈结构移植性更好,可控性更强。

JVM中的虚拟机栈是描述Java方法执行的内存区域,属【线程私有】。

栈中的元素用于支持虚拟机进行方法调用,每个方法从开始调用到执行完成的过程,就是栈帧从入栈到出栈的过程。

本地方法栈(Native Method Stack)

本地方法栈和Java虚拟机栈实现的功能与抛出异常几乎相同。只不过

虚拟机栈是为虚拟机执行Java方法(也就是字节码)服务
本地方法栈则为虚拟机使用到的Native方法服务
如String中的intern()方法。

Java堆(Java Heap)

JVM启动时创建,存放所有的类实例及数组对象。
除实例数据,还保存对象的其他信息,如Mark Word(存储对象哈希码,GC标志,GC年龄,同步锁等信息)

方法区

方法区和堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

Java虚拟机规范中定义方法区是堆的一个逻辑区划部分,具体实现根据不同虚拟机来实现。
HotSpot在:
JDK7时,方法区放在永久代
JDK8时,方法区放在元数据空间,通过GC对该区域进行管理

永久代与元空间

回顾了JVM的基础模型后我们来了解今天的重点!!!

永久代与元空间

什么是永久代和元空间??

方法区是一种规范,不同的虚拟机厂商可以基于规范做出不同的实现,永久代和元空间就是出于不同jdk版本的实现。

说白了,方法区就像是一个接口,永久代与元空间分别是两个不同的实现类而已。只不过永久代是这个接口最初的实现类,后来这个接口一直进行变更,直到最后彻底废弃这个实现类,由新实现类——元空间进行替代。


从上图中可以看到,永久代与堆中的老年代是连续的,这里的连续指的是物理地址连续,永久代本身并不在堆中。因此,老年代与永久代其中一个满了,都会触发Full GC。

由于方法区主要存储类的相关信息,所以对于动态生成类的情况比较容易出现永久代的内存溢出。最典型的场景就是,在 jsp 页面比较多的情况,容易出现永久代内存溢出,会报出"java.lang.OutOfMemoryError: PermGen space "异常。

在JDK1.8之后我们的永久代就变成了元空间

元空间(Metaspace),不再与堆连续,而是直接存在于本地内存中,也就是机器的内存。理论上机器内存有多大,元空间的野心就有多大。

综上所述,表面上是为了避免OOM异常,因为通常使用PermSize和MaxPermSize设置了永久代的大小上限,但是不是总能设置到刚刚合适的大小,而使用默认值是很容易遇到OOM错误。当使用元空间时,可以加载多少类的元数据就不再由MaxPermSize控制,而是由系统的实际可用空间来控制。

Java8中,使用元空间替换永久代的原因
在之前的版本中,字符串常量池存在于永久代中,在大量使用字符串的情况下,非常容易出现OOM的异常。此外,JVM加载的class的总数,方法的大小等都很难确定,因此对永久代大小的指定难以确定。太小的永久代容易导致永久代内存溢出,太大的永久代则容易导致虚拟机内存紧张。

JVM之 永久代与元空间相关推荐

  1. JDK1.8 JVM元数据区取代了永久代,元数据空间并不在虚拟机中,而是使用本地内存

    JDK1.8 JVM运行时内存数据区域划分.1.8同1.7比,最大的差别就是:元数据区取代了永久代.元空间的本质和永久代类似,都是对JVM规范中方法区的实现.不过元空间与永久代之间最大的区别在于:元数 ...

  2. JVM之 方法区、永久代(PermGen space)、元空间(Metaspace)三者的区别

    文章目录 0.前言(JVM 运行时区域) 1.PermGen(永久代) 2.Metaspace(元空间) 3.JDK6 .JDK7.JDK8 内存溢出的示例 4.元空间与本地内存 5.总结 0.前言( ...

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

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

  4. JVM之方法区、永久代(PermGen space)、元空间(Metaspace)三者的区别

    JVM体系结构 根据 JVM 规范,JVM 运行时区域大致分为 方法区.堆.虚拟机栈.本地方法栈.程序计数器 五个部分. 1).方法区 方法区是JVM 所有线程共享. 主要用于存储类的信息.常量池.方 ...

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

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

  6. Java8内存模型—永久代(PermGen)和元空间(Metaspace)

    一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫&q ...

  7. 永久代内存java_Java8内存模型—永久代(PermGen)和元空间(Metaspace)

    一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫&q ...

  8. java 8 永久代_Java8内存结构—永久代(PermGen)和元空间(Metaspace)

    本文转载 一.JVM 内存结构 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是 ...

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

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

  10. Java8:永久代(PermGen)和元空间(Metaspace)

    一.PermGen(永久代) 绝大部分 Java 程序员应该都见过 "java.lang.OutOfMemoryError: PermGen space "这个异常.这里的 &qu ...

最新文章

  1. 用c# 实现设计器 DesignSurface
  2. JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系
  3. linux启动数据库orl,linux5.4下oracle问题
  4. Qcon出品全球软件开发者大会北京站-低代码实践与应用
  5. Java:银行账户类
  6. maven如何修改本地仓库与中央仓库
  7. 2016年的云计算安全趋势
  8. 【CentOS 7笔记5】,主机互相登陆#
  9. 归并排序Python代码
  10. jenkins远程构建job_jenkins分布式构建job
  11. IT技术图书之《敏捷无敌》当小说看 你信吗?
  12. 拓端tecdat|Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测
  13. 侯捷——STL源码剖析 笔记
  14. 有道词典java下载电脑版下载手机版下载安装_【有道词典官方下载】有道词典PC版下载_多特软件站...
  15. c4d怎么导入图片描图建模_巧用C4D的参考图学习角色人物建模(躯干)
  16. 计算机革命的主角和英雄——十大超级老牌黑客
  17. 前端水印生成方案(网页水印+图片水印)
  18. Win7安全模式启动卡在Classpnp.sys
  19. 简单抽奖机系统(中午吃什么?)
  20. python xlwings在Linux上报错XlwingsError:Your platform only supports the instantiation via xw.Book

热门文章

  1. 基于R语言进行K折交叉验证
  2. string.h 详解
  3. JS清除IE浏览器缓存的方法
  4. SaaS销售迎来破局 渠道分销重回主场
  5. java生产者消费者 阻塞_java之使用阻塞队列实现生产者,消费者模式
  6. 计算机应用能力考试湖南成绩查询,湖南计算机等级考试成绩查询入口
  7. html梯形选项卡,css 梯形tab标签页
  8. [书籍翻译]12周撰写期刊文章 学术出版成功指南——第 1 周:设计写作计划
  9. python 转盘 圆形,用python实现一个转盘
  10. 手机忘记开机密码怎么办?我来教你