秋招后端开发面试题 - JVM垃圾回收算法


目录

  • JVM垃圾回收算法
    • 前言
    • 面试题
      • 垃圾收集有哪些算法,各自的特点?
      • 说一下新生代的区域划分?
      • Minor GC/Young GC、Major GC/Old GC、Mixed GC、Full GC?
      • Minor GC/Young GC 什么时候触发?
      • 什么时候会触发 Full GC?
      • 频繁 minor gc 怎么办?
      • HotSpot 为什么要分为新生代和老年代?
      • 对象什么时候会进入老年代?/ 内存分配和回收原则?


JVM垃圾回收算法

前言

已经找到工作了,分享秋招时的笔记。祝大家都能顺利找到自己心仪的工作。


面试题

垃圾收集有哪些算法,各自的特点?

虚拟机的垃圾回收机制是一种自动内存管理的机制,用于回收不再被程序使用的内存,以便将其释放并重新分配给新的对象

常见的垃圾回收策略有:

标记 - 清除:

  • 标记阶段:标记所有需要回收的对象
  • 清除阶段:回收被标记的对象,但会产生内存碎片,影响内存利用率

标记 - 复制:

  • 将内存分为两块,一块称为 “From” 空间,一块称为 “To” 空间
  • 标记阶段,将存活对象复制到 “To” 空间
  • 清除阶段,清空 “From” 空间
  • 适用于存活率较低的场景,避免了碎片化

标记 - 整理:

  • 标记阶段标记所有需要回收的对象
  • 清除阶段将所有存活的对象向一端移动,然后清除边界以外的内存
  • 避免碎片化

分代收集算法:

  • 根据对象的存活周期将堆划分为不同的区域(一般分为新生代和老年代)
  • 针对不同区域使用不同的收集算法,新生代一般使用复制算法,老年代使用标记 - 清除或标记 - 整理算法
  • 根据大部分对象在新生代快速回收和老年代存活较长的特点,分代收集算法可以提高垃圾回收效率

说一下新生代的区域划分?

  • 新生代的垃圾收集主要采用标记 - 复制算法,因为新生代的存活对象较少,每次复制少量的存活对象效率较高
  • 新生代分为 Eden 空间和两块较小的 Survivor 空间,每次分配内存只使用 Eden 和其中一块 Survivor 空间
  • 当发生垃圾收集时,将 Eden 和 Survivor 中仍然存活的对象复制到另一块 Survivor 空间后清理空间

Minor GC/Young GC、Major GC/Old GC、Mixed GC、Full GC?

  • 部分收集 (Partial GC):目标不是完整收集整个 Java 堆的垃圾收集
    • 新生代收集 (Minor GC/Young GC):指目标只是新生代的垃圾收集
    • 老年代收集 (Major GC/Old GC):指目标只是老年代的垃圾收集,只有 CMS 收集有这种行为
    • 混合收集 (Mixed GC):目标是收集整个新生代以及部分老年代的垃圾收集,只有 G1 收集有这种行为
  • 整堆收集 (Full GC):收集整个 Java 堆和方法区的垃圾收集

Minor GC/Young GC 什么时候触发?

  • 新创建的对象会先在新生代 Eden 区进行分配
  • 如果 Eden 区没有足够的空间,就会触发 Minor GC 来清理新生代

什么时候会触发 Full GC?

  • Young GC 之前检查老年代:在要进行 Young GC 的时候,发现老年代可用的连续空间小于平均升级对象大小,触发 Full GC
  • 老年代空间不足:如果老年代内存使用率过高,就会触发 GC
  • System.gc() 命令:使用命令执行 Full GC

频繁 minor gc 怎么办?

通常情况下,由于新生代空间较小,Eden 空间很快就满了,就会频繁 Minor GC
可以通过增大新生代空间来降低 Minor GC 频率

HotSpot 为什么要分为新生代和老年代?

  • 是为了更好地适应不同对象的生命周期和垃圾收集算法,从而提高垃圾回收的效率和性能

对象什么时候会进入老年代?/ 内存分配和回收原则?

  • 长期存活的对象将进入老年代:在对象的头信息中存储对象的迭代年龄,迭代年龄会在每次 Young GC 中增加一,当年龄达到 15 时,对象将进入老年代
  • 大对象直接进入老年代:占用大量连续内存空间的对象在被加载就会直接进入老年代
  • 动态对象年龄判定:如果相同年龄的对象占一半以上,则年龄大于等于该年龄的对象直接进入老年代
  • 空间分配担保:在 Young GC 后,新生代仍然有大量对象存活,就需要老年代进行分配担保,把 Survivor 无法容纳的对象送入老年代

秋招后端开发面试题系列目录
一、Java
1.1 Java基础上
1.2 Java基础下
1.3 Java集合
1.4 JavaIO
1.5 Java多线程上
1.6Java多线程下
二、JVM
2.1 JVM底层原理
2.2 垃圾回收器
2.3 垃圾回收算法
2.4 类加载机制
2.5 运行时数据区
三、MySQL
3.1 MySQL基础
3.2 事务
3.3 索引
3.4 锁机制
3.5 MVCC
四、Redis
4.1 Redis基础
4.2 缓存原理
五、中间件
5.1 RabbitMQ
六、Spring开源框架
6.1 Spring
6.2 Spring MVC
6.3 Spring Boot
6.4 MyBatis
七、操作系统
八、计算机网络
九、设计模式
十、微服务架构
十一、Spring Cloud分布式
11.1 分布式基础
11.2 Spring Cloud
11.3 GateWay
11.4 Nacos
11.5 OpenFeign
11.6 Ribbon
十二、算法
十三、项目

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

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

相关文章

程序员做知识付费,做大纲时要注意那些点?

大纲的注意点 本节我们将讨论制作大纲时的要点。由于大家对大纲的制作已有一定了解,因此我们不会全面展开,而是聚焦于一些关键注意事项与大家分享。 条理性 最关键的一点是大纲必须具备清晰的条理性。如果大纲在逻辑结构上不够清晰,无论其他…

初二的孩子怎么沟通和教育,这个教育方法家长必看

初中生正值“身心聚变”时期,其中初二学生尤为明显,美国心理学家霍林沃斯称之为“心理性断乳期”。他们希望别人把他们看成“大人”,希望别人信任尊重他们。为此,家长应当积极配合学校工作,针对这种思想,采…

PHP基于B/S版 医院不良事件管理系统源码vscode+laravel8医院如何加强不良事件上报系统的管理 AEMS系统源码

PHP基于B/S版 医院不良事件管理系统源码vscodelaravel8医院如何加强不良事件上报系统的管理 AEMS系统源码 医院安全(不良)事件管理AEMS系统AEMS采用无责的、自愿的填报不良事件方式,有效地减轻医护人员的思想压力,实现以事件为主要…

快速编写测试用例(超详细~)

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 当你学会了如何设计测试用例之后,接下来便是开始用例…

设计模式设计原则

设计原则 前言:了解设计模式之前,一定要先理解什么设计原则,只有这样才能悟透设计模式的根本。 快速入口 工厂模式单例模式 1.何为设计? 按哪一种思路或者标准来实现的功能;功能相同,可以有不同设计的方…

黑马苍穹外卖

sky-pojo子模块内容 Entity:实体,通常和数据库中的表对应DTO:数据传输对象,通常用于程序中各层之间传递数据(eg:前端返回的json数据,后端要接收,并且转化为java对象,此时…

QtConcurrent::run操作界面ui的注意事项(1)

先说结论:QtConcurrent::run启动的耗时处理函数,不允许处理ui界面对象,如控件,如进度条等等! QtConcurrent::run非常好用,胜过QThead的两种方式(run和moveToThread),例如…

拆炸弹(Lc1652)——模拟

你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。 为了获得正确的密码,你需要替换掉每一个数字。所有数字会 同时 被替换。 如果 k > 0 ,将第 i 个数字用 接下来 k 个数字之…

ERP系统电子文件归档和电子档案管理规范

ERP系统电子文件归档和电子档案管理规范 1 范围 本文件描述了企业资源计划(ERP)系统形成电子文件归档和电子档案管理的方法。 本文件适用于企业资源计划(ERP)系统(含采购、销售、物料、生产计划、质量、设备、项目…

使用C#和EF Core实现高效的SQL批量插入

在软件开发中,批量插入数据是一个常见的需求,特别是在数据迁移、初始化数据库或进行大量数据处理时。Entity Framework Core (EF Core) 是一个流行的.NET对象关系映射器(ORM),它简化了数据库操作,但在进行大…

Linux CPU 飙升 排查五步法

排查思路-五步法 1. top命令定位应用进程pid 找到最耗时的CPU的进程pid top2. top-Hp[pid]定位应用进程对应的线程tid 找到最消耗CPU的线程ID // 执行 top -Hp [pid] 定位应用进程对应的线程 tid // 按shift p 组合键,按照CPU占用率排序 > top -Hp 111683.…

用wordpress建跨境电商独立站的5大优势

免费和开源 WordPress是一个免费的开源内容管理系统,用户可以自由下载、安装和使用,无需支付版权费用或订阅费用。开源特性也意味着用户可以根据自己的需求修改和定制代码,或者使用其他开发者提供的插件和主题来扩展和美化网站。 易用和灵活…

探索Vue 3.0中的v-html指令

探索Vue 3.0中的v-html指令 一、什么是v-html指令?1、 在Vue 3.0中使用v-html2、 注意事项 二、结语 一、什么是v-html指令? Vue.js作为一款流行的JavaScript框架,不断地演进着。随着Vue 3.0的发布,开发者们迎来了更加强大和灵活…

CMS清理流程及问题

CMS(Concurrent Mark Sweep,并发标记清除)收集器是以获取最短回收停顿时间为目标的收集器(追求低停顿),它在垃圾收集时使得用户线程和GC线程并发执行,因此在垃圾收集过程中用户也不会感到明显的卡顿。从名字…

SparkSQL编程入口和模型与SparkSQL基本编程

SparkSQL编程入口和模型 SparkSQL编程模型 主要通过两种方式操作SparkSQL,一种就是SQL,另一种为DataFrame和Dataset。 1)SQL:SQL不用多说,就和Hive操作一样,但是需要清楚一点的是,SQL操作的是表&#xf…

为什么很多人不推荐你用JWT?

为什么很多人不推荐你用JWT? 如果你经常看一些网上的带你做项目的教程,你就会发现 有很多的项目都用到了JWT。那么他到底安全吗?为什么那么多人不推荐你去使用。这个文章将会从全方面的带你了解JWT 以及他的优缺点。 什么是JWT? 这个是他的官网JSON…

Linux学习(一)-- 简单的认识

目录 1. Linux的诞生 2.Linux发行版 拓展: (1)什么是Linux系统的内核? (2)什么是Linux系统发行版? 1. Linux的诞生 Linux创始人: 林纳斯 托瓦兹 Linux 诞生于1991年,作者上大学…

2×24.5W、内置 DSP、低失真、高信噪比、I2S 输入 D 类音频功率放大器,完美替换TPA5805,晶豪,致盛,

ANT3825 是一款高集成度、高效率的双通道数字 输入功放。供电电压范围在 5V~18V,数字接口 电源支持 3.3V 或 1.8V。双通道 BTL 模式下输出 功率可以到 224.5W(4Ω,16V,THDN1%), 单通道 PBTL 模式下可以输出 37W&#x…

Spring IoCDI(2)—IoC详解

目录 一、IoC详解 1、Bean的存储 (1)Controller(控制器存储) 获取bean对象的其他方式 Bean 命名约定 (2)Service(服务存储) (3)Repository&#xff08…

注册英国公司都有什么好处

注册英国公司是一项相对简单直接的程序,通常需要通过 Companies House(英国公司注册局)完成。以下是注册英国公司的步骤: 选择公司名称: 首先,您需要选择一个独特的公司名称。您可以通过Companies House的…