秋招后端开发面试题 - 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.mfbz.cn/a/598086.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在ATECLOUD测试平台测试新能源车内连接器

在测试车内连接器的温度时,需要用到直流电源和温度巡检仪,通过温度巡检仪采集连接器工作时的温度。由于用户在测试时会用到多台直流电源和温度巡检仪,并且型号不一样。因此,在用ATECLOUD测试连接器温度时,技术工程师需…

框架漏洞RCE-1

一、前提 1、命令执行漏洞:直接调用操作系统命令。攻击者构造恶意命令,将命令拼接到正常的输入中,达到恶意攻击的目的。 (1)、常见命令执行函数 PHP:exec、shell_exec、system、passthru、popen、proc_open、反引号等 ASP.N…

拉普拉斯丨独家冠名2024年度ATPV技术分论坛,助力产业科技持续创新

为了进一步促进行业技术交流,推进光伏行业发展及标准建设的进程,针对高效电池,领跑组件,新产品认证及应用等技术专题及国内外光伏标准的最新进程,由中国绿色供应链联盟光伏专委会(ECOPV)指导的2…

Java 运行的底层原理

Java是一种跨平台的编程语言,其底层原理涉及到了多个方面,包括Java虚拟机(JVM)、字节码、类加载机制、垃圾回收器等。让我们逐一深入了解Java运行的底层原理。 1. Java虚拟机(JVM) Java虚拟机是Java程序运…

Java代码基础算法练习-年龄问题-2024.05.07

数学家维纳智力早熟,11岁就上了大学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10 个数字正好包含了从0到9这10个数字&#…

Mybatis报错sql injection violation, syntax error: TODO :IDENTIFIER

今天被这个报错搞了一下午 <select id"getMmZxZffs" resultType"cn.vetech.asms.pay.service.freepwdpay.vo.ZxZffsQueryVO" parameterType"cn.vetech.asms.pay.service.freepwdpay.dto.ZxZffsQueryDTO">select t.A skFs,t.B,t.C skFsm…

建筑物健康监测:振弦式应变计的应用

随着科技的进步和建筑安全意识的提高&#xff0c;对建筑物健康状况的监测变得日益重要。振弦式应变计作为一种高精度、高灵敏度的测量工具&#xff0c;已经在建筑物健康监测中得到了广泛应用。本文将探讨如何使用振弦式应变计进行建筑物的健康监测&#xff0c;并分享一些最佳实…

安卓手机原生运行 ARM Ubuntu 24.04 桌面版(一)

本篇文章&#xff0c;聊一聊尝试让安卓手机原生运行 Ubuntu&#xff0c;尤其是运行官方未发布过的 ARM 架构的 Ubuntu 24.04 桌面版本。 写在前面 最近的几篇文章&#xff0c;都包含了比较多的实操内容、需要反复的复现验证&#xff0c;以及大量的调试过程&#xff0c;为了不…

Linux——综合实验

要求 按照上面的架构部署一个简单的web节点所有的服务器使用DNS服务器作为自己的DNS服务器 就是/etc/reslov.conf 中nameserver的值必须是途中dns服务器的地址所有的数据库都是用mysql应用 nfs共享导出在客户端(web服务器上)使用autofs在自动挂载&#xff0c;或者写入/etc/fsta…

使用 Gitea 进行私有 Git 仓库管理

在本文中&#xff0c;我们将介绍如何使用 Gitea 搭建并管理私有 Git 仓库。Gitea 是一个轻量级的 Git 服务&#xff0c;提供了类似于 GitHub 的功能&#xff0c;适合个人和小团队使用。我们将通过以下步骤来完成搭建和配置 Gitea 服务器。 步骤一&#xff1a;安装 Gitea 首先…

沉浸式的三维立体3D产品互动展示,有哪些优势?如何实现?

沉浸式的三维立体3D产品互动展示&#xff0c;可以720度旋转缩放查看产品的每一个细节&#xff0c;具有很强的交互性和逼真性&#xff0c;从品牌营销的层面来分析&#xff0c;具有以下优势&#xff1a; 首先&#xff0c;3D产品展示能够带来生动、真实的视觉冲击效果。 随着消费…

OurBMC开源大赛企业获奖队伍专访来啦!

精彩纷呈的 OurBMC 开源大赛已告一段落&#xff0c;经历为期四个月的实战&#xff0c;各个参赛队伍也积淀了丰富的实践经验与参赛心得。本期&#xff0c;社区特别邀请 OurBMC 开源大赛获奖企业团队分享「走进OurBMC开源大赛&#xff0c;共同践行开放包容、共创共赢的开源精神」…

Python下运行 XQuery 的方法

要在 Python 中运行 XQuery&#xff0c;我们可以使用一些库或工具来执行 XQuery 查询。Saxon-HE 是一个开源的 XQuery 和 XSLT 处理器&#xff0c;它是用 Java 编写的&#xff0c;并提供了 Python 绑定。你可以使用 saxonc Python 模块来调用 Saxon-HE&#xff0c;执行 XQuery …

阿赵UE引擎C++编程学习笔记——HelloWorld

大家好&#xff0c;我是阿赵。   从这一篇开始学习虚幻引擎的C编程。   学习所有编程好像都应该从HelloWorld开始&#xff0c;所以我这里也不例外。不过为了能打印出HelloWorld&#xff0c;需要做的事情还不少。不过到了能打印出HelloWorld的时候&#xff0c;我感觉学习的过…

文件夹重命名技巧:克服文件夹名混乱不规律的难题,实现高效管理

在数字时代&#xff0c;我们每天都在与无数的文件夹打交道。这些文件夹中可能存储着文档、图片、视频等各种类型的文件。然而&#xff0c;随着文件夹数量的增加&#xff0c;如何有效地管理和命名这些文件夹成为了一个挑战。混乱和不规律的文件夹名不仅降低了工作效率&#xff0…

237基于matlab的偏振态仿真

基于matlab的偏振态仿真&#xff0c;不同偏振态下光强计算。本仿真软件可以仿真波片对偏振光的相位调制过程。用户可以通过改变波片的类型&#xff0c;波片长轴与 X 轴的夹角&#xff0c;起偏器透光与 X 轴的夹角&#xff0c;检偏器透光轴与 X 轴的夹角等参数&#xff0c;来观察…

企业年中宣传的几个核心点

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 过了五一小长假&#xff0c;就来到了夏天&#xff0c;在生机勃勃的春天里&#xff0c;我们定好了全年的宣传计划&#xff0c;包括要举行哪些活动&#xff0c;参加哪些展会&#xff0c;一…

ADS过孔---过孔建模自动化

当前快速建模的方法有两类&#xff1a;一是脚本自动化&#xff0c;也就是今天要分享的方法&#xff0c;但该方法需要工程师有基本的脚本编辑能力&#xff0c;然后根据自己的需要去修改&#xff0c;难度较大一点点&#xff1b;二是参数化建模&#xff0c;也就是在GUI界面输入相应…

Milvus向量数据库(一)Milvus存储byte[]类型源向量数据

两种路线&#xff1a; 第一种是把byte[]转换为List< float >&#xff0c;然后存储到Milvus的floatVector中第二种是把byte[]转换为ByteBuffer&#xff0c;然后存储到Milvus的BinaryVector中 步骤&#xff1a; 我先用的是第一种&#xff0c;但是在转换float过程中&…

Java Stream A

1. Stream API概述 Java 8 Stream是Java 8中引入的一个新的API&#xff0c;用于处理集合和数组等数据结构的元素。它允许您在数据集上进行功能性操作&#xff0c;例如过滤、映射、排序等&#xff0c;而不需要编写循环或迭代器等底层代码。 Java 8 Stream与集合不同&#xff0c;…
最新文章