JVM之 永久代与元空间
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之 永久代与元空间相关推荐
- JDK1.8 JVM元数据区取代了永久代,元数据空间并不在虚拟机中,而是使用本地内存
JDK1.8 JVM运行时内存数据区域划分.1.8同1.7比,最大的差别就是:元数据区取代了永久代.元空间的本质和永久代类似,都是对JVM规范中方法区的实现.不过元空间与永久代之间最大的区别在于:元数 ...
- JVM之 方法区、永久代(PermGen space)、元空间(Metaspace)三者的区别
文章目录 0.前言(JVM 运行时区域) 1.PermGen(永久代) 2.Metaspace(元空间) 3.JDK6 .JDK7.JDK8 内存溢出的示例 4.元空间与本地内存 5.总结 0.前言( ...
- JVM原理系列--元空间(MetaSpace)与永久代(PermGen)的区别
原文网址:JVM原理系列--元空间(MetaSpace)与永久代(PermGen)的区别_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍JVM中元空间(MetaSpace)与永久代(PermG ...
- JVM之方法区、永久代(PermGen space)、元空间(Metaspace)三者的区别
JVM体系结构 根据 JVM 规范,JVM 运行时区域大致分为 方法区.堆.虚拟机栈.本地方法栈.程序计数器 五个部分. 1).方法区 方法区是JVM 所有线程共享. 主要用于存储类的信息.常量池.方 ...
- jvm系列二:Java8内存模型-永久代(PermGen)和元空间(Metaspace)
原文地址:https://www.cnblogs.com/paddix/p/5309550.html 一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地 ...
- Java8内存模型—永久代(PermGen)和元空间(Metaspace)
一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫&q ...
- 永久代内存java_Java8内存模型—永久代(PermGen)和元空间(Metaspace)
一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫&q ...
- java 8 永久代_Java8内存结构—永久代(PermGen)和元空间(Metaspace)
本文转载 一.JVM 内存结构 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是 ...
- 永久代退出舞台,元空间腾空出世
文章目录 一.前言 二.元空间由来和本质 2.1 元空间的诞生与永久代的消失 2.2 从永久代到元空间 2.2.1 JDK8之前,永生代在哪里? 2.2.2 JDK8之后,永生代废弃,元空间诞生 2. ...
- Java8:永久代(PermGen)和元空间(Metaspace)
一.PermGen(永久代) 绝大部分 Java 程序员应该都见过 "java.lang.OutOfMemoryError: PermGen space "这个异常.这里的 &qu ...
最新文章
- 用c# 实现设计器 DesignSurface
- JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系
- linux启动数据库orl,linux5.4下oracle问题
- Qcon出品全球软件开发者大会北京站-低代码实践与应用
- Java:银行账户类
- maven如何修改本地仓库与中央仓库
- 2016年的云计算安全趋势
- 【CentOS 7笔记5】,主机互相登陆#
- 归并排序Python代码
- jenkins远程构建job_jenkins分布式构建job
- IT技术图书之《敏捷无敌》当小说看 你信吗?
- 拓端tecdat|Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测
- 侯捷——STL源码剖析 笔记
- 有道词典java下载电脑版下载手机版下载安装_【有道词典官方下载】有道词典PC版下载_多特软件站...
- c4d怎么导入图片描图建模_巧用C4D的参考图学习角色人物建模(躯干)
- 计算机革命的主角和英雄——十大超级老牌黑客
- 前端水印生成方案(网页水印+图片水印)
- Win7安全模式启动卡在Classpnp.sys
- 简单抽奖机系统(中午吃什么?)
- python xlwings在Linux上报错XlwingsError:Your platform only supports the instantiation via xw.Book