JVM中方法区、永久代、元空间详解以及关系?

这篇具有很好参考价值的文章主要介绍了JVM中方法区、永久代、元空间详解以及关系?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先我们需要先复习一下jvm的大致内存图,如下:

JVM中方法区、永久代、元空间详解以及关系?

哦~ ,想起来了,原来方法区属于jvm的运行时数据区,且作用就是存储类信息、方法信息、常量池信息等静态数据。

 (补充一下:运行时数据区中的红色是指方法区和堆是线程共享的,其他几个都是线程私有的)

好的,回想起来方法区的相关概念后,我们进入正题:

方法区是什么?

其实呢,我们经常说的方法区只是java虚拟机规范的一个概念,就像是一个接口;那么接口总要有人实现吧,所以永久代和元空间就起着这样的作用,它们实际上都是方法区,是方法区在不同jdk版本的实现。

永久代是什么?

在jdk7以及jdk7之前,方法区被称为永久代(PermGen)

此时永久代是 Java 堆(Java Heap)的一部分,用于存储类信息、方法信息、常量池信息等静态数据。

而 Java 堆是 JVM 中存储对象实例和数组的内存区域,也就是说,永久代是 Java 堆的一个子区域。

换句话说,永久代中存储的静态数据与堆中存储的对象实例和数组是分开的,它们有不同的生命周期和分配方式。

但是,永久代和堆的大小是相互影响的,因为它们都使用了 JVM 堆内存,因此它们的大小都受到 JVM 堆大小的限制。

对字符串常量池的一个扩展:

注:jdk7之前字符串常量池也存放在永久代中,而jdk7时,脱离了永久代,存放于堆空间中。

 永久代的分布如下:

JVM中方法区、永久代、元空间详解以及关系?

元空间是什么?

在jdk8时,彻底移除了永久代,方法区正式改名为元空间(Metaspace);  

首先需要确认的是,它们的功能并没有改变,仍然是用于存储类信息、方法信息、常量池信息等静态数据。

它们最大的区别就是永久代存在于Java堆中,它的大小受到 Java 虚拟机本身大小的限制;而元空间则是一块本机内存区域,和 JVM 内存区域是分开的, 所以只受本机可用内存的限制。

那么既然与永久代不同,那元空间就具有一些永久代没有的优点,如下:

  • 它不会导致 OutOfMemoryError 错误,因为元空间的大小可以动态调整。

  • 元空间使用本机内存,而不是 JVM 堆内存,这可以避免堆内存的碎片化问题。

  • 元空间中的垃圾收集与堆中的垃圾收集是分离的,这可以避免应用程序在运行过程中因为进行类加载和卸载而频繁地触发 Full GC。

对字符串常量池的一个扩展:

jdk8中,字符串常量池都存放在堆中,而它最开始的老东家永久代已经摇身一变成为了元空间,并且脱离了java堆空间,存放在堆以外的本地内存中。

元空间分布如下:

JVM中方法区、永久代、元空间详解以及关系?

以上就是我对方法区这几个概念的理解,如果有需要补充的地方,记得留言评论哦~

最后,其实这篇文章中我觉得大家最需要搞清楚的一句话就是:永久代和元空间是方法区不同jdk版本的实现,搞清楚这三个概念,不记混淆了,就是很大的收获了,大家就已经很棒了~

JVM中方法区、永久代、元空间详解以及关系?

 文章来源地址https://www.toymoban.com/news/detail-486983.html

到了这里,关于JVM中方法区、永久代、元空间详解以及关系?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • “让我们为你添加账号”跳过方法以及后续操作

    按Ctrl+shift+f3就可以了 跳过之后别着急关机,现在是管理员账号,但微软是默认关闭管理员权限的 所以 1.打开cmd,查看自己电脑的用户账号 2.然后输入以下代码,显示账号信息 如果账号被停用,“帐户启用”那一行会显示“No” 如果账号已启用,“帐户启用”那一行会显示“

    2024年02月12日
    浏览(64)
  • 详解数据库、Hive以及Hadoop之间的关系

    数据库是一个用于存储和管理数据的系统。 数据库管理系统(DBMS)是用于管理数据库的软件。 数据库使用表和字段的结构来组织和存储数据。 关系型数据库是最常见的数据库类型,使用SQL(Structured Query Language)进行数据操作和查询。 数据库管理系统(DBMS):数据库管理系

    2024年03月15日
    浏览(45)
  • 【Java基础篇】方法的使用(方法的使用以及形参实参的关系)

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏 :Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用,数组的使用,类和对象,继承和多态,抽象类和接口等内容 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 方

    2024年02月08日
    浏览(30)
  • Java JVM 堆、栈、方法区详解

    目录 1. 栈 2. 堆 3. 方法区 4. 本地方法栈 5. 程序计数器 首先来看一下JVM运行时数据区有哪些。 在介绍JVM栈之前,先了解一下  栈帧  概念。 栈帧:一个栈帧随着一个方法的调用开始而创建,这个方法调用完成而销毁。栈帧内存放者方法中的局部变量,操作数栈等数据。 Jav

    2024年01月19日
    浏览(32)
  • Java 设计者模式以及与Spring关系(六) 装饰和模版方法模式

    本文是个系列一次会出两个设计者模式作用,如果有关联就三个,除此外还会讲解在spring中作用。 23设计者模式以及重点模式 我们都知道 设计者模式 有 3 类 23 种设计模式,标红是特别重要的设计者模式建议都会,而且熟读于心,标蓝是指其次重要建议也要明白。 (1)创建

    2024年01月24日
    浏览(31)
  • python | 复杂网络:将关系对转换为邻接矩阵(常规方法以及pivot函数)

    复杂网络中常常需要将得到的关系对(图一)转换为邻接矩阵,并存储为csv格式。本文将介绍两方法来进行处理:方法一是构建数据框赋予值。方法二是利用pivot () 函数将一维表转换为二维表。本文所采用的例子为 有向加权网络 。 首先我们的原始数据为关系对(图一):

    2023年04月08日
    浏览(24)
  • JVM 垃圾回收详解之内存分配和回收原则+死亡对象判断方法

    当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收

    2023年04月19日
    浏览(45)
  • 【JVM】对String::intern()方法深入详解(JDK7及以上)

    String::intern()是一个本地方法,它的作用是如果字符串常量池中 已经包含 一个等于此String对象的字符串,则返回代表池中这个字符串的String对象的引用;否则,会将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。----书上描述 已经包含。。。可能不太

    2024年02月12日
    浏览(32)
  • Ubuntu20.04安装Nvidia驱动——4060显卡(黑屏解决方法) 1.首先禁用Nouveau(Ubuntu安装显卡驱动详细步骤)

    如果按照正常方法安装不成功(如无法连接第二屏幕,nvidia-smi无显示),先尝试在安装后不管什么方法进入桌面后在应用程序中找到NVIDIA X Server Settings,在最后一项PRIME Profiles将NVIDIA On-Demand改为Performance Mode,重启后正常,安装深度学习环境也无问题,但是我的神州刷新率还

    2024年02月05日
    浏览(68)
  • WIN10/11 百度网盘“同步空间” 文件资源管理器 侧边栏/导航栏路径 删除方法 以及Office插件 彻底删除方法

    彻底删除百度网盘Office插件知乎链接,实测office更新仍会恢复插件; 最近每次更新百度网盘后,都会在资源管理器 导航栏 多出一个很烦人的路径: 这对于用不到同步空间的用户不胜其烦,下面说明删除方法: WIN+R输入regedit,确定后在注册表最上面的地址栏输入: 计算机

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包