一道面试题:JVM老年代空间担保机制

2023-11-20

面试问题

昨天面试的时候,面试官问的问题:

  1. 什么是老年代空间担保机制?担保的过程是什么?
  2. 老年代空间担保机制是谁给谁担保?
  3. 为什么要有老年代空间担保机制?或者说空间担保机制的目的是什么?
  4. 如果没有老年代空间担保机制会有什么不好?
    下面我们就带着这些问题去了解一下JVM老年代空间担保机制吧。

老年代空间担保机制

在这里插入图片描述
如图,在每次MinorGC之前,老年代可用空间会和新生代所有对象的总大小进行对比,如果老年代可用空间大于新生代所有对象的总大小,就可以直接进行MinorGC,因为即使MinorGC后所有对象都活着,S区放不下,也可以放到老年代中。如果老年代的可用空间小于新生代所有对象的总大小,就会进行下一个判断,判断老年代的可用空间和新生代每次MinorGC后进入老年代对象的平均大小,如果发现老年代的可用内存大于每次MinorGC后进入老年代对象的平均大小(举个例子:之前每次Minor GC后,平均都有10MB左右的对象会进入老年代,那么此时老年代可用内存大于10MB。这就说明很可能这次Minor GC过后也是差不多10MB左右的对象会进入老年代,此时老年代空间是够的),那么可以尝试进行MinorGC,但是有可能出现MinorGC后所有对象都存活,全部进去老年代,导致老年代可用空间不足,(例:老年代剩余100M,新生代中对象总大小为200M,但是每次MinorGC后平均进入老年代的对象大小为80M,但是此次MinorGC后所有对象全部存活,导致老年代可用空间不足)此时就会触发FullGC。反之,如果老年代的可用空间小于每次MinorGC后进入老年代对象的平均大小,则会触发FullGC。如果FullGC之后,老年代也没有足够的可用空间存放新生代的对象,则会出现OOM内存溢出。

了解了这个担保流程之后,我们再来看我们的面试题:

  1. 什么是老年代空间担保机制?担保的过程是什么?
    上面文字解释的就是。
  2. 老年代空间担保机制是谁给谁担保?
    我理解的是老年代给新生代的S区做担保。
  3. 为什么要有老年代空间担保机制?或者说空间担保机制的目的是什么?
    目的:避免频繁的进行FullGC。
  4. 如果没有老年代空间担保机制会有什么不好?
    如果没有这个担保机制,就会直接执行Full GC,这样对性能的影响频次会增加。

哪些对象会进行老年代

  • 动态对象年龄判断:当前放对象的Survivor区域里,一批对象的总大小大于了这块Survivor区域的内存大小的50%,那么此时大于等于这批对象年龄的对象,就可以直接进入老年代了。
  • 大对象直接进入老年代。
  • 15次Minor GC后还存活的对象。
  • Minor GC后的对象太多无法放入Survivor区。

Full GC的触发时机

  • 老年代空间不足。比如大对象或者年龄超过15的对象进入老年代。
  • 空间分配担保失败。这个就是咱们今天说的这种情况。老年代可用内存小于新生代全部对象的大小,如果没开启空间担保参数,会直接触发Full GC,所以一般空间担保参数都会打开。
  • Concurrent Mode Failure 执行CMS GC的过程中同时有对象要进入老年代,而此时老年代空间不足(可能是GC过程中浮动垃圾过多导致暂时性的空间不足)便会报Concurrent Mode Failure错误并触发Full GC。这种情况下会使用Serial Old收集器,也就是发生了退化,CMS退化为serial gc,Serial Old收集器是单线程的,对GC的影响很大。concurrent mode failure产生的原因是老年代剩余的空间不够,导致了和gc线程并发执行的用户线程创建的大对象(由PretenureSizeThreshold控制新生代直接晋升老年代的对象size阀值)不能进入到老年代,只要stop the world来暂停用户线程,执行GC清理,单线程对全堆以及 metaspace 进行回收,STW 的时间会特别长,对业务系统的可用性影响比较大。可以通过设置CMSInitiatingOccupancyFraction预留合适的CMS执行时剩余的空间。
  • 老年代可用内存小于历次新生代GC后进入老年代的平均对象大小,此时会提前Full GC;但是"-XX:HandlePromotionFailure"参数,在JDK 1.6以后就被废弃了,所以现在一般都不会在生产环境里设置这个参数了。在JDK 1.6以后,只要判断"老年代可用空间"大于"新生代对象总和"或者"老年代可用空间"大于"历次Minor GC升入老年代对象的平均大小",两个条件满足一个,就可以直接进行Minor GC,不需要提前触发Full GC了。
  • 新生代Minor GC后的存活对象大于Survivor,那么就会进入老年代,此时老年代内存不足,触发Full GC。这里的不足就是判断条件后还是不足或者经过判断后进行YGC后放入老年代此时的空间不足,然后进行Full GC,就会出现频繁Full GC。达到一定情况后,就会OOM了。
  • 如果用的是CMS收集器,老年代可用内存大于历次新生代GC后进入老年代的对象平均大小,但是老年代已经使用的内存空间超过了("-XX:CMSInitiatingOccupancyFaction=92%"JDK6默认值 )这个参数指定的比例,也会自动触发Full GC。
  • 未指定老年代和新生代大小,堆伸缩时会触发Full GC。
  • 调用System.gc(),只是建议虚拟机执行Full GC,但虚拟机不一定真正去执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一道面试题:JVM老年代空间担保机制 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • WTL 界面设计篇(CSkinEdit)

    头文件声明 CSkinEdit h pragma once include SkinManager h 不支持滚动条皮肤 图片背景支持不完整 Edit控件必须是ES MULTILINE风格 SetMarginsEx才能生效 ES MULTI
  • 【Linux】使用systemd设置开机自启动命令

    目录 1 使用使用systemd实现开机自动运行命令 1 1 新建一个 service文件 1 2 编写 service文件 1 2 1 Unit 1 2 2 Service 1 2 3 Install 1 3 启动服务并设置自启动 2 编
  • Windows运行常用命令(win+R)

    1 calc 启动计算器 2 notepad 打开记事本 3 write 写字板 4 mspaint 画图板 5 snippingtool 截图工具 支持无规则截图 6 mplayer2 简易widnows media player 7 S
  • mybatis中type-aliases-package的用法

    springboot项目中的application yml文件中的mybatis type aliases package 什么时候用 mapper xml文件中resultMap的type parameterType resultType
  • Unity中级客户端开发工程师的进阶之路

    上期UWA技能成长系统之 Unity高级客户端开发工程师的进阶之路 得到了很多Unity开发者的肯定 通过系统的学习 可以掌握游戏性能瓶颈定位的方法和常见的CPU GPU 内存相关的性能优化方法 UWA技能成长系统是UWA根据学员的职业发展
  • 1分钟快速掌握Vue Router的使用?

    简介 Vue Router 是 Vue js 官方的路由管理器 它和 Vue js 的核心深度集成 让构建单页面应用变得易如反掌 包含的功能有 嵌套的路由 视图表 模块化的 基于组件的路由配置 路由参数 查询 通配符 基于 Vue js 过
  • AI工程化:各家的AI平台、AI中台架构图

    中台的概念 AI 中台是用来构建大规模智能服务的基础设施 是一套完整的人工智能模型全生命周期管理平台和服务体系 提供模型设计训练 模型 算法库 复用标注管理 模型监控服务等能力支持 AI中台旨在让企业业务前台可以短兵作战 小步快跑 降低试错
  • Unity 粒子特效、材质发光 HDR ShaderGraph图文教程[完成lit发光设置]

    效果如图 准备工作 在hdr模式下 关闭Directional Light 相机设置 移动球挂一个点光源作为子节点 设置自行调节 0 创建移动球的材质及shader shader gt 在Project Create Shader Grap
  • 查找出某表字段数据不为空

    DECLARE CURSOR temp IS SELECT COLUMN NAME FROM ALL TAB COLUMNS WHERE TABLE NAME Upper TEST v num NUMBER BEGIN FOR i IN t
  • 如何在 Vultr 上部署 ONLYOFFICE 文档 v7.3

    现在您可使用通过 Vultr 市场提供的一键式应用在 Vultr 架构中轻松部署 Docker 版本的 ONLYOFFICE 文档 一键式应用是什么 一键式应用是一个包含所有必要预配置组件的镜像 可用于便捷地在运行有 Ubuntu OS 的
  • 有向图的邻接表的建立,深度遍历并输出(c语言实现有向网)

    有向图的邻接表的建立 深度遍历并输出 c语言实现有向网 为方便理解 首先先为图的邻接表画一个模型 邻接表可以分为两部分 1 表头节点 2 弧节点 如上图 因为写的代码是有向网 所以选择上图 首先在脑海里建立一个模型 代码如下 include
  • 【PrimeTime 基本命令】

    https www micro ip com drchip php mode 2 cid 17
  • 毕业设计 STM32人体红外测温枪温度采集系统 - 单片机

    文章目录 1 前言 2 主要器件 3 实现效果 4 设计原理 MLX90614 红外温度传感器 5 部分实现代码 6 最后 1 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求
  • go语言的安装已经调试

    go语言作为google的一个主推语言 最近很多人都在研究 也花了一点时间对他的安装进行了测试 本人使用Sublime Text 2 GoSublime gocode 顾名思义首先是安装Go 这里有很详细的安装说明 http code go
  • 单相逆变器的建模与仿真

    1 电路拓扑 本次设计采用单相全桥逆变电路 使用LC滤波器 负载使用单相桥式整流 电路如图所示 2 控制思路 控制部分采用PI控制 包含电压外环和电流内环 而电流内环又分为电感电流反馈和电容电流反馈两种 其中电感电流内环电压外环的控制框图和
  • pip install 国内镜像源

    经验证 阿里的云最快 记得是https不是http 对于Python开发用户来讲 PIP安装软件包是家常便饭 而国外的源下载速度太慢 浪费时间 而且常出现下载后安装出错问题 故把pip安装源替换成国内镜像 可大幅提高下载速度 还可以提高安装
  • 计算机网络学习笔记第四章(网络层)超详细整理

    目录 4 1 网络层概述 1 简介 2 总结 4 2 网络层提供的两种服务 1 面向连接的虚电路服务 2 无连接的数据报服务 3 虚电路服务与数据报服务的对比 4 3 IPv4 1 概述 2 分类编制的IPv4地址 2 1 简介 2 2 总
  • 第六篇:进阶篇 车内的吸声性能及测试方法

    本专栏分享传统NVH知识点 从声学理论 材料声学 汽车噪声振动分析 车辆及其零部件甚至原材料的声学测试方法等多维度介绍汽车NVH 一些专用术语同时给出了中英文对照 欢迎新人 同行 爱好者一起交流 由于内容写的较为仓促 有误的地方欢迎大家批评
  • 【安装】win下的openvino安装及onnx模型转换.xml和.bin

    安装文档参考 openvino安装指导 包含相应依赖的安装 三步到位 我装的是python3 8 vs2019 cmake3 24 0 一般最新版本 这几个安装及注意的细节在文档中都有描述 一定一定要按上述文档安装 并且细节要注意 尤其是o
  • 一道面试题:JVM老年代空间担保机制

    面试问题 昨天面试的时候 面试官问的问题 什么是老年代空间担保机制 担保的过程是什么 老年代空间担保机制是谁给谁担保 为什么要有老年代空间担保机制 或者说空间担保机制的目的是什么 如果没有老年代空间担保机制会有什么不好 下面我们就带着这些问