【JVM面试】从JDK7 到 JDK8, JVM为啥用元空间替换永久代?

news2024/11/25 23:00:49

系列文章目录

【JVM系列】第一章 运行时数据区
【面试】第二章 从JDK7 到 JDK8, JVM为啥用元空间替换永久代?



  大家好,我是青花。拥有多项发明专利(都是关于商品、广告等推荐产品)。对广告、Web全栈以及Java生态微服务拥有自己独到的见解。曾经辅导过若干个计算机专业的学生进入到软件开发行业就业。希望和大家一起成长进步。
  今天给大家带来的文章:从JDK7 到 JDK8, JVM为啥用元空间替换永久代?希望对同学们有所帮助。

文章目录

  • 系列文章目录
  • 一、JVM 的内存模型组成部分
    • 1.1、方法区
    • 1.2、JDK不同版本的内存模型以及永久代
      • 1.2.1、JDK1.6
      • 1.2.2、JDK1.7
      • 1.2.3、JDK1.8
  • 二、从永久代、元空间内存分配对比
  • 三、Oracle 关于Java虚拟机的规划
  • 四、归纳汇总
    • 4.1、内存控制问题
    • 4.2、gc问题
    • 4.3、Oracle的规划
  • 总结


在这里插入图片描述

Java 面试专栏
JVM区域

从JDK7 到 JDK8, JVM为啥用元空间替换永久代?

从永久代、元空间内存分配对比
从gc方面对比
Oracle的虚拟机改造

一、JVM 的内存模型组成部分

JVM 的内存模型主要包括程序计数器(Program Counter Register)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack)、堆(Heap)和方法区(Method Area)。

1.1、方法区

    方法区(Method Area)是所有线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
    方法区只是 JVM 规范中定义的一个概念,针对 Hotspot 虚拟机,Java8 之前使用永久代(Permanent Generation,简称 PermGen)实现,而 Java8 之后使用元空间(Metaspace)实现。

类的元数据信息
包括类的名称、访问标志、父类、接口、字段、方法等信息。
运行时常量池
在Java代码中,常量可以被直接定义在类或接口中,这些常量在编译后被存储在Class文件的常量池中,而运行时常量池则是从Class文件中加载的。
静态变量和常量
类的静态变量和常量都存储在方法区中,它们在类加载的时候被初始化并分配内存空间。
方法字节码
在Java中,方法的字节码被编译成Class文件并存储在方法区中。
即时编译器
为了提高程序的执行效率,JIT会将热点代码编译成本地机器码并存储在方法区中。

1.2、JDK不同版本的内存模型以及永久代

1.2.1、JDK1.6

在这里插入图片描述

1.2.2、JDK1.7

在这里插入图片描述

1.2.3、JDK1.8

在这里插入图片描述

二、从永久代、元空间内存分配对比

    在JDK6/7 Hotspot虚拟机中,方法区的实现是在永久代里面,它里面主要存储运行时常量池、class类元信息等。
    永久代属于JVM运行时内存中的一块存储空间,我们可以用过 -XX:PermSize来设置永久代的大小。
    当内存不够的时候,会触发垃圾回收。

    在JDK8 Hotspot虚拟机中,取消了永久代,由元空间来实现方法区的数据存储。元空间不属于JVM内存,而是直接使用本地内存,因此不需要考虑GC问题。
     默认情况下元空间是可以无限制的使用本地内存的,但是我们也可以使用JVM参数来限制内存使用大小。

三、Oracle 关于Java虚拟机的规划

    在Java 8之后,Oracle决定将HotSpot和JRockit两个虚拟机(JVM)合并。HotSpot是Oracle的默认JVM,也是Java社区中最常用的,而JRockit是一个由瑞典公司做的高性能JVM,特别适合于对性能要求较高的环境。

    合并这两个虚拟机是为了集中两者的优势,并为Java用户提供一个更强大、更统一的平台。在JDK 9及以后的版本中,JRockit的一些特性,如垃圾收集和内存管理,已经被引入到HotSpot中。

    至于“永久代(PermGen)”,这是Java 7及以前版本中的一种内存区域,用于存储类的元数据。在Java 8及以后的版本中,永久代已经被移除,取而代之的是元空间(Metaspace),这是一个不受内存限制的区域。所以,如果你正在使用的是Java 8或更高版本,你不会再看到“永久代”这个概念。


四、归纳汇总

4.1、内存控制问题

    在JDK1.7版本里面,永久代内存是有上限的,虽然我们可以通过参数来设置,但是JVM加载的class总数、大小是很难确定的,综上所述,会很容易出现OOM问题。

4.2、gc问题

永久代的对象是通过FullGC进行垃圾收集,也就是和老年代同时实现垃圾收集。替换成元空间以后,简化了Full GC,可以在不进行暂停的情况下并发地释放类数据,同时也提升了GC的性能。

4.3、Oracle的规划

Oracle将HotSpot和JRockit两个虚拟机(JVM)合并,而JRockit没有永久代。


总结

本文章从内存控制、gc以及Oracle对于JVM的规划三方面入手,阐述了为何在JDK8, JVM为啥用元空间替换永久代。通过本文的分析,我们也可以看到,JVM的不断升级,给开发者带来了很多便利,也使得Java应用的性能越来越稳定,不管是内存控制,还是gc性能,都比以前得到了很大的提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1097502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【京东开源项目】微前端框架MicroApp 1.0正式发布

介绍 MicroApp是由京东前端团队推出的一款微前端框架,它从组件化的思维,基于类WebComponent进行微前端的渲染,旨在降低上手难度、提升工作效率。MicroApp无关技术栈,也不和业务绑定,可以用于任何前端框架。 源码地址…

如何优雅的实现接口统一调用

耦合问题 有些时候我们在进行接口调用的时候,比如说一个push推送接口,有可能会涉及到不同渠道的推送,以我目前业务场景为例,我做结算后端服务的,会与金蝶财务系统进行交互,那么我结算后端会涉及到多个结算…

第二证券:国际油价大幅上涨 后市恐难持续走高

上个买卖周,受巴以冲突影响,原油商场成为各方关注的焦点。到上星期五收盘,布伦特原油周内涨幅达7%以上,为本年2月以来最大周涨幅,WTI原油周内累计上涨近6%。业内人士认为,其时地缘要素是导致油价出现异动的…

3分钟,快速上手Postman接口测试!

Postman是一个用于调试HTTP请求的工具,它提供了友好的界面帮助分析、构造HTTP请求,并分析响应数据。实际工作中,开发和测试基本上都有使用Postman来进行接口调试工作。有一些其他流程的工具,也是模仿的Postman的风格进行接口测试工…

DDD之上下文映射图(Context Mapping)

领域驱动设计系列文章,点击上方合集↑ 1. 开头 在DDD中,限界上下文与限界上下文之间需要相互集成,这种集成关系在DDD中称为上下文映射(Context Mapping),也就是子域与子域之间的集成关系。 所以首先我们…

2023年中国微创手术器械及耗材发展趋势分析:发展呈现集成化、智能化[图]

随着微创外科手术渗透率的提升,国内微创外科手术器械及配件(MISIA)市场迎来爆发,预计2023年微创手术器械及耗材(MISIA)市场规模将达到238亿元,其中一次性MISIA市场规模约为204亿元,可…

网络安全——自学(黑客技术)

前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学?如何学? 今天给大家分享一下,很多人上来就说想学习黑客&#xff0c…

【OpenVINO】OpenVINO C# API 常用 API 详解与演示

OpenVINO C# API 常用 API 详解与演示 1 安装OpenVINO C# API2 导入程序集 3 初始化OpenVINO 运行时内核4 加载并获取模型信息4.1 加载模型4.2 获取模型信息 5 编译模型并创建推理请求6 张量Tensor6.1 张量的获取与设置6.2 张量的信息获取与设置 7 加载推理数据7.1 获取输入张量…

vue2 引用3D模型

一、首先安装对应的插件&#xff08;前往查看model-viewer&#xff09; # install peer dependency ThreeJS npm install three # install package npm install google/model-viewer二、页面直接引用组件&#xff08;例子&#xff09; <model-viewer style"width: 5…

Clion debug查看cv::Mat或多维数组的变量值

在使用Clion的debug模式查看变量的数据值时,一般在variable窗口下直接查看,比如: 可当变量为cv::Mat或其它类型的多维数组的,尤其当数组以指针或引用形式传递时,如cv::Mat& imgSrcL,在variable窗口下查看,会发现Clion只提供这个变量的维度和data的首个数据信息等,如…

科普向丨语音芯片烧录工艺的要求

语音芯片烧录工艺要求烧录精度、速度、内存容量、电源稳定性、兼容性和数据安全性。这些要素需优化和控制以保证生产高效、稳定、安全并烧录出高质量的语音芯片。不同厂家生产的语音芯片在烧录工艺上存在差异&#xff0c;需相应设计和研发以实现兼容。 一、烧录精度 语音芯片烧…

Nginx:URL重写(示意图+举例+配置讲解)

示意图&#xff1a; URL Rewrite URL Rewrite 是一种用于修改网站 URL 结构或改变 URL 路径的技术。它允许网站管理员修改 URL 的外观&#xff0c;使其更加友好、可读&#xff0c;并且有助于改善网站的搜索引擎优化&#xff08;SEO&#xff09;。通过 URL Rewrite&#xff0c;…

iCloud涨价不用慌!学会使用群晖生态将本地SSD“上云”

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是想使用群晖生态软件&#xff0c;就必须要在服务端安装群晖系统&#xff0c;具体如何安装群晖虚拟机请参考&#xff1a; 1. 安装并配置synology drive1.1 安装群辉drive套件1.2 在局域…

【应用程序代理对象ApplicationDelegate-应用程序启动过程介绍 Objective-C语言】

一、那我们接着昨天的内容,继续往下讲 1.有人对昨天最后这块儿内容有点儿晕,再捋一下吧, 1)我们刚开始的时候,是不是在Main.storyboard里面,放了一个按钮 2)我呢,想在点击按钮的时候,执行一些操作,对吧, 所以呢,我给它拖了一个事件, 拖到类实现里面, 3)那,首…

.NET Core/.NET6 使用DbContext 连接数据库,SqlServer

安装以下NuGet包 Microsoft.EntityFrameworkCore.SqlServer&#xff1a;SQL server 需要添加包 Microsoft.EntityFrameworkCore.Tools Newtonsoft.Json&#xff1a;用于Json格式转换 创建一个实体类来表示数据库表。在项目中创建一个名为Customer.cs的文件&#xff0c;并添加以…

国内原汁原味的免费sd训练工具--哩布哩布AI

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 写在前面 一.体验与操作 1.注册 2.为何可…

享搭低代码平台:加速企业应用开发,轻松搭建表单和报表

在当今快节奏的商业环境中&#xff0c;企业需要快速响应市场需求并提供高效的解决方案。然而&#xff0c;传统的应用开发过程繁琐、耗时&#xff0c;并且需要专业的编程技能。为了解决这些问题&#xff0c;享搭低代码平台应运而生。本文将详细介绍享搭低代码平台的特点和优势&a…

工信部新政策发布,算力基础设施建设即将提速!

前言&#xff1a;算力是集信息计算力、网络运载力、数据存储力于一体的新型生产力&#xff0c;主要通过算力基础设施向社会提供服务。算力基础设施对于实现数字化转型、培育未来产业&#xff0c;以及形成经济发展新动能等方面具有重要作用。 其中&#xff0c;提升算力的高效运载…

内网穿透的应用-轻松玩转群晖生态!使用内网穿透实现本地SSD数据云备份

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是想使用群晖生态软件&#xff0c;就必须要在服务端安装群晖系统&#xff0c;具体如何安装群晖虚拟机请参考&#xff1a; 1. 安装并配置synology drive1.1 安装群辉drive套件1.2 在局域…

Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv 计算机竞赛

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; Yolov安全帽佩戴检测 危险区域进入检测 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&am…