图片来自:JVM之 方法区、永久代(PermGen space)、元空间(Metaspace)三者的区别

方法区:(逻辑上)

  • 逻辑上的东西,是JVM 的规范,所有虚拟机必须遵守的。

  • 是JVM 所有线程共享的、用于存储类的信息、常量池、方法数据、方法代码等。

永久代:(方法区的实现、JDK7及之前、主要是和元空间对比)

PermGen , 就是 PermGen space ,全称是 Permanent Generation space ,是指内存的永久保存区域。

  • PermGen space 则是 HotSpot 虚拟机基于JVM规范对方法区的一个落地实现,并且只有 HotSpot 才有 PermGen space。
  • 而如 JRockit(Oracle)、J9(IBM) 虚拟机有方法区 ,但是就没有 PermGen space。
  • PermGen space 是JDK7及之前, HotSpot虚拟机对方法区的一个落地实现。在JDK8被移除。‘

Metaspace(元空间、JDK8及之后):

元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存

  • 移除PermGen(永久代)从从JDK7 就开始。例如,字符串内部池,已经在JDK7 中从永久代中移除。直到JDK8 的发布将宣告 PermGen(永久代)的终结。
  • 其实,移除 PermGen 的工作从 JDK7 就开始,永久代的部分数据就已经转移到了 Java Heap 或者是 Native Heap。
  • 但永久代仍存在于JDK7 中,并没完全移除,比如:
  1. 字面量 (interned strings)转移到 Java heap;
  2. 类的静态变量(class statics)转移到Java heap ;
  3. 符号引用(Symbols) 转移到 Native heap ;
JDK版本 方法区的实现 运行时常量池所在的位置
JDK6 PermGen space(永久代) PermGen space(永久代)
JDK7 PermGen space(永久代) Heap(堆)
JDK8 Metaspace(元空间) Heap(堆)

JDK6、JDK7 时,方法区 就是 PermGen(永久代)。
JDK8 时,方法区就是 Metaspace(元空间)。

这篇文章写的很好:JVM之 方法区、永久代(PermGen space)、元空间(Metaspace)三者的区别

为什么使用元空间替换永久代?

表面上看是为了避免OOM异常。

因为通常使用PermSize和MaxPermSize设置永久代的大小就决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到OOM错误。

当使用元空间时,可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。

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

  1. 由于永久代内存经常不够用或者发生内存泄露,爆出异常 java.lang.OutOfMemoryError: PermGen 。
  2. 字符串存在永久代中,容易出现性能问题和内存溢出。
  3. 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。
  4. 永久代会位GC带来不必要的复杂度,而且回收效率偏低。
  5. Oracle可能会将HotSpot和JRockit合二为一。

 HotSpot和JRockit合并产生一个超级JVM

方法区、永久代、元空间的区别相关推荐

  1. JVM 1.8 永久代---元空间 的变动

    介绍JVM的内存模型的博客:https://blog.csdn.net/q5706503/article/details/84614158 JDK8 HotSpot JVM 将移除永久区,使用本地内存 ...

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

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

  3. Davids原理探究:JDK8将永久代(PermGen)替换为元空间(MetaSpace)的原因

    文章目录 JDK8将永久代(PermGen)替换为元空间(MetaSpace)的原因 什么是方法区 永久代产生的原因 将永久代替换为源空间的原因 JDK8将永久代(PermGen)替换为元空间(Met ...

  4. java元空间扩容_JVM元空间(Metaspace)

    从方法区(PermGen)到元空间(Metaspace) 方法区(PermGen) JDK1.8以前的HotSpot JVM有方法区,也叫永久代(permanent generation). 方法区用 ...

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

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

  6. JVM(类加载、运行时数据区、堆内存、方法区、本地接口、执行引擎和垃圾回收)java虚拟机(JVM)的超详细知识点

    JVM虚拟机 一.JVM的概述 1.为什么要学习JVM 2.虚拟机 3.JVM的作用 作用 特点 4.JVM的位置 5.JVM的分类 6.各个组成部分的用途 7.Java 代码的执行流程 8.JVM ...

  7. java字面量 方法区_(一)java的内存模型

    程序计数器(私有) 程序计数器:"是一个非常小的内存空间,用来保证程序依次执行",它可以看作是当前线程所执行的字节码的行号指示器 由于java虚拟机的多线程是通过线程轮流切换并分配 ...

  8. JVM-04-运行时数据区-堆,方法区

    文章目录 堆 堆的核心概述 堆与进程 堆内存细分 JVisualVM可视化查看堆内存 设置堆内存大小与 OOM 设置堆内存 OOM 新生代与老年代 对象分配 具体过程⭐ 分配策略 分配一般情况 分配特 ...

  9. JVM 运行时内存空间详解——元空间

    通过上一篇文章,我们大体了解了JVM的整体架构,其分为:元数据(JDK7是方法区).堆.虚拟机栈.本地方法栈.程序计数器几个部分. 本篇文章,咱们对元空间进行剖析,一探究竟. 1. 元空间介绍 在JD ...

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

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

最新文章

  1. 【camera】自动泊车-视觉车位检测相关资料汇总(论文、数据集、源代码、相关博客、演示demo)(1)
  2. glibc降级后怎么恢复 linux_Linux(CentOS)GLIBC出错补救方式
  3. ngrok配置信息_ngrok内网穿透服务器搭建及配置(附 frp 配置)
  4. skimage 学习笔记
  5. 向当前url添加参数
  6. 对于随机过程方面书籍的评论(转贴)
  7. 索尼a5100_索尼a5100有什么接口
  8. 嵌入式Linux内核,文件系统的制作
  9. python爬网页html乱码问题
  10. 基于web的网上书城网站设计与实现(SpringBoot ,Vue,MySQL )
  11. 服务器安全(防止被攻击)
  12. Java实现对png图片文件电子签名操作
  13. 麦肯锡逻辑树——快速分析和解决问题的有效方法
  14. 【数字图像处理】二值图像行程编码
  15. 人生若只如初见,当时只道是寻常
  16. 【蓝桥杯选拔赛真题09】Scratch小猫旅行 少儿编程scratch蓝桥杯选拔赛真题讲解
  17. 1120_野火RT-Thread教程学习4_RTT学习基础知识梳理
  18. 今日头条这么火,主要解决了用户的哪些基本痛点
  19. linux ghost视频教程,Linux攻略 用Ghost备份Linux系统的方法
  20. 【通信系统】移动通信系统基础知识

热门文章

  1. was 部署php,was 配置web服务器
  2. linux查看隐藏文件命令
  3. pink老师世纪佳缘作业
  4. vscode 添加版权信息
  5. iir滤波器的基本网络结构_(IIR)滤波器的基本结构-Read.ppt
  6. java String 转map、list
  7. 团队组成五个基本要素_团队构成的五大要素
  8. 柳州铁一中机器人_柳州铁路第一中学的办学成果
  9. C++中优先队列priority_queue的基础用法
  10. python爬取ZOL高清壁纸