原文网址:JVM原理系列--元空间(MetaSpace)与永久代(PermGen)的区别_IT利刃出鞘的博客-CSDN博客

简介

说明

本文介绍JVM中元空间(MetaSpace)与永久代(PermGen)的区别。

永久代和元空间与方法区的关系

JVM一共分为五个部分:堆,方法区,虚拟机栈,本地方法栈,程序计数器。

永久代和元空间都属于方法区,都是方法区的实现。

JDK8的的变化

从JDK7 开始,JDK开发者们就开始消灭永久代了,JDK8完全完成:

  1. 永久代的字面量 (interned strings)     转移到了 Java heap;    (JDK7完成)
  2. 永久代的静态变量(class statics)        转移到了Java heap ;   (JDK7完成)
  3. 永久代的符号引用(Symbols)              转移到了 Native heap ;(JDK7完成)
  4. 永久代中的 class metadata                    转移到了 Meta Space; (JDK8完成)
    1. 永久代参数 (PermSize MaxPermSize) 改为 元空间参数(MetaspaceSize MaxMetaspaceSize)

元空间与永久代的区别

元空间

使用本地内存(native mermory)。

它的最大大小取决于系统内存,而不是堆大小。

永久代

使用JVM的内存。

为什么要使用元空间?

原因1:避免OOM异常

使用永久代时

使用永久代时,通常使用 -XX:PermSize 和 -XX:MaxPermSize设置永久代的初始大小和设置永久代的最大值,但是不是总能知道应该设置为多大合适(太小,容易导致永久代溢出;太大,容易导致老年代溢出),如果使用默认值很容易遇到OOM(OutOfMemory)错误。

使用元空间时

JDK8 的方法区是元空间,其参数设置是 -XX:MetaspaceSize=N 设置原始元空间大小; -XX:MaxMetaspaceSize=N 设置最大元空间大小,但默认是没有限制的。

元空间可以加载多少类的元数据由系统的实际可用空间来控制。

元空间使用本地内存(Native memory)。元空间使用本地内存也就意味着只要本地内存足够,就不会出现OOM的错误。默认情况下元空间大小是无限的。(堆使用的是JVM连续的物理内存)

原因2:将虚拟机进行合并

Oracle想合并HotSpot和JRockit的代码。

元空间里是什么数据?

Metaspace 是用来存放 class metadata 的,class metadata 用于记录一个 Java 类在 JVM 中的信息,包括但不限于 JVM class file format 的运行时数据:

  1. Klass 结构

    1. 这个非常重要,可以理解为一个 Java 类在虚拟机内部的表示;
  2. method metadata
    1. 包括方法的字节码、局部变量表、异常表、参数信息等;
  3. 注解;
  4. 方法计数器,记录方法被执行的次数,用来辅助 JIT 决策

虽然每个 Java 类都关联了一个 java.lang.Class 的实例,而且它是一个贮存在堆中的 Java 对象。但是类的 class metadata 不是一个 Java 对象,它不在堆中,而是在 Metaspace 中。

元空间的分配、回收、配置

什么时候分配 Metaspace 空间?

当一个类被加载时,它的类加载器会负责在 Metaspace 中分配空间用于存放这个类的元数据

什么时候回收 Metaspace 空间?

分配给一个类的空间,是归属于这个类的类加载器的,只有当这个类加载器卸载的时候,这个空间才会被释放。

所以,只有当这个类加载器加载的所有类都没有存活的对象,并且没有到达这些类和类加载器的引用时,相应的 Metaspace 空间才会被 GC 释放。

配置 Metaspace 空间

-XX:MaxMetaspaceSize:Metaspace 总空间的最大允许使用内存,默认是不限制。

-XX:CompressedClassSpaceSize:Metaspace 中的 Compressed Class Space 的最大允许内存,默认值是 1G,这部分会在 JVM 启动的时候向操作系统申请 1G 的虚拟地址映射,但不是真的就用了操作系统的 1G 内存。

JVM原理系列--元空间(MetaSpace)与永久代(PermGen)的区别相关推荐

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

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

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

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

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

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

  4. JVM原理系列--类加载过程(有实例)

    原文网址:JVM原理系列--类加载过程(有实例)_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的类加载流程,有实例. 类加载过程 流程概述 加载=> 链接(验证+准备+解析)=> ...

  5. java元空间扩容_调整元空间metaspace大小

    MaxMetaspaceSize和CompressedClassSpaceSize是控制元空间大小的旋钮 现在,这些参数可能有点混乱.首先,它们有两种,它们有着微妙的不同含义,它们相互影响. 所以让我 ...

  6. JVM原理系列--双亲委派模型

    原文网址:JVM原理系列--双亲委派模型_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java虚拟机的双亲委派模型. 工作过程 说明 双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求, ...

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

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

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

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

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

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

最新文章

  1. java 和 flash socket通信封装
  2. python文字教程-Python 爬虫零基础教程(3):输出一个网页上的文字
  3. k8s节点亲和性:pod和node的亲和性、硬策略、软策略
  4. 【嵌入式】Libmodbus之RTU模式Slave端程序示例
  5. Lucene使用与优化(转)
  6. 【SHOI2009】【BZOJ2028】会场预约(线段树染色)
  7. 使用ARCore+Unity概述
  8. pd对焦速度_自动对焦速度是由相机还是镜头决定的?
  9. 公众号快速注册并认证小程序功能介绍
  10. NB-IOT开发|nbiot开发教程《三》AT指令类模组驱动-STM32实现AT指令状态机
  11. 【WINDOWS / DOS 批处理】for命令详解(一)
  12. Android AOSP 下载和编译
  13. input type属性
  14. linux系统下查看 显卡 信息
  15. 全栈Linux运维-Linux云计算运维与高级架构班课程 全新自动化运维必学课程
  16. 纯函数,副函数具体例子
  17. CSS核心内容:标准流、盒子模型、浮动、定位
  18. 教师计算机课游戏教学设计,《有趣的游戏》教学设计5篇
  19. 原理 拉普拉斯金字塔_图像金字塔分层算法
  20. 微信小程序云开发学习

热门文章

  1. python 3.6.8安装suds操作webservice
  2. idea 配置weblogic
  3. springBoot + KISSO实现单点登录
  4. Txx考试(codevs 2894)
  5. Java基础之《分布式事务(4)—分布式开源框架使用》
  6. 银行笔试题目汇总——通用素质能力测试(EPI)
  7. 【java内存泄漏的定位与分析】
  8. java 强制下线_JavaWeb之实现账号强制下线功能
  9. 电脑上没有mysql怎么办_mysql装完电脑里面没mysql相关服务解决办法
  10. springboot使用yml文件如何多环境(dev、test、prod)配置