当前位置: 首页 > news >正文

高级java每日一道面试题-2024年10月23日-JVM篇-说一下JVM有哪些垃圾回收算法?

如果有遗漏,评论区告诉我进行补充

面试官: 说一下JVM有哪些垃圾回收算法?

我回答:

在 Java 虚拟机 (JVM) 中,垃圾回收 (Garbage Collection, GC) 是一项非常重要的功能,用于自动管理应用程序的内存。JVM 采用多种垃圾回收算法来决定何时以及如何回收不再使用的对象所占用的内存。以下是几种常见的垃圾回收算法及其详细说明:

1. 标记-清除(Mark-Sweep)算法

  • 原理:这是最基本的垃圾回收算法,分为标记阶段和清除阶段。在标记阶段,垃圾回收器会遍历所有对象,并标记存活的对象。在清除阶段,垃圾回收器会清除未被标记的对象,并释放其内存。从根节点(如全局变量、本地变量等)开始遍历,标记所有可达的对象。
  • 优点:实现简单,不需要额外的内存空间。能够有效地回收不可达的对象。
  • 缺点:会产生大量不连续的内存碎片,可能导致空间浪费。同时,标记和清除两个过程都需要遍历所有对象,效率较低。需要暂停整个应用程序(Stop-The-World)。

2. 复制(Copying)算法

  • 原理:为了解决标记-清除算法中的内存碎片问题,复制算法将内存空间划分为两个相等的区域,每次只使用其中一个区域。当垃圾回收时,它将活动的对象复制到另一个区域,并清除当前区域的所有对象。
  • 优点:解决了内存碎片问题,且每次只需要复制存活的对象,复制成本相对较低。无需处理碎片化问题。回收速度快。
  • 缺点:需要两倍的内存空间,内存利用率较低。同时,如果存活对象较多,复制成本会相对较高。需要两倍的内存空间。只适用于新生代(Young Generation),因为新生代中的对象存活率较低。

3. 标记-压缩(Mark-Compact)算法

  • 原理:标记-压缩算法是在标记-清除算法的基础上进行优化,解决了内存碎片问题。它在标记和清除阶段之后,将存活的对象压缩到内存的一端,并直接清除边界以外的内存。
  • 优点:避免了内存碎片的问题,且不需要额外的内存空间。
  • 缺点:压缩过程需要额外的时间,可能会降低垃圾回收的效率。仍然需要暂停应用程序。移动对象可能会影响性能。

4. 分代收集(Generational)算法

  • 原理:分代收集算法是一种基于对象存活周期的垃圾回收算法。它将内存分为新生代和老生代两个区域。新生代通常包含大量新创建的对象,老生代包含长时间存活的对象。垃圾回收器根据不同代的特点采用不同的回收策略。新生代采用复制算法,老生代采用标记-压缩算法。
  • 优点:能够根据对象存活周期的不同,采用不同的回收策略,提高垃圾回收的效率。
  • 缺点:需要维护新生代和老生代的内存划分和回收策略,增加了垃圾回收器的复杂性。
新生代 (Young Generation)
  • 用于存放新创建的对象。
  • 采用复制算法。
  • 垃圾回收频率较高。
老年代 (Old Generation)
  • 用于存放经过多次垃圾回收后仍然存活的对象。
  • 采用标记-清除或标记-压缩算法。
  • 垃圾回收频率较低。
永久代 (Permanent Generation)
  • 用于存放类的元数据。
  • JDK 8 之后已经被 Metaspace 替代。

5. 分区(Region)算法

  • 原理:分区算法将内存划分为多个独立的区域,每个区域可以独立地进行垃圾回收。这种算法可以根据应用程序的特点定制回收策略,提高垃圾回收的灵活性。
  • 优点:提高了垃圾回收的灵活性,可以根据应用程序的特点定制回收策略。
  • 缺点:需要管理多个区域的内存分配和回收,增加了垃圾回收器的复杂性。同时,如果区域划分不合理,可能会导致内存碎片问题。

6. 引用计数(Reference Counting)算法

  • 原理:引用计数算法通过维护每个对象的引用计数来跟踪对象的生命周期。当一个对象被引用时,其引用计数加一;当引用失效时,引用计数减一。当引用计数为零时,表示对象不再被使用,可以被回收。
  • 优点:实现简单,能够实时回收垃圾对象。
  • 缺点:无法处理循环引用问题。如果两个对象相互引用,即使它们都不再被其他对象引用,它们的引用计数也不会为零,因此无法被回收, 需要额外的空间来存储计数器。增加了每次引用操作的开销。

7. 自适应混合回收(Adaptive Hybrid)算法

  • 原理:自适应混合回收算法是一种结合了分代收集和复制算法的垃圾回收策略。它根据不同代的存活对象比例动态调整回收策略。当新生代存活对象比例较高时,采用复制算法;当老生代存活对象比例较高时,采用标记-压缩算法。
  • 优点:能够根据应用程序的特点自适应地调整回收策略,提高垃圾回收的效率和准确性。
  • 缺点:需要动态调整回收策略,可能会增加垃圾回收器的复杂性。

8. 并发标记-清除 (Concurrent Mark-Sweep, CMS)

  • 原理:CMS 是一种试图减少垃圾回收时暂停时间的算法,通过并发的方式执行标记和清除过程。
  • 优点:减少了应用程序暂停的时间。提高了吞吐量。
  • 缺点:仍然存在碎片化问题。可能导致较大的暂停时间(Full GC)。

9. G1 (Garbage First)

  • 原理:G1 是一种新的垃圾回收器,设计用于替换 CMS,它将堆划分为多个大小相等的区域(Region),并在这些区域之间进行垃圾回收。
  • 优点:减少暂停时间。自动处理碎片化问题。支持更大的堆。
  • 优点:相对复杂。需要更多的元数据。

以上是 Java 虚拟机中常用的几种垃圾回收算法。每种算法都有自己的特点和适用场景。理解这些算法对于优化 Java 应用程序的性能非常重要。在实际应用中,JVM 会根据堆的大小、对象的存活率等因素选择最适合的垃圾回收策略。

相关文章:

高级java每日一道面试题-2024年10月23日-JVM篇-说一下JVM有哪些垃圾回收算法?

如果有遗漏,评论区告诉我进行补充 面试官: 说一下JVM有哪些垃圾回收算法? 我回答: 在 Java 虚拟机 (JVM) 中,垃圾回收 (Garbage Collection, GC) 是一项非常重要的功能,用于自动管理应用程序的内存。JVM 采用多种垃圾回收算法来决定何时以及如何回收…...

高效文本编辑与导航:Vim中的三种基本模式及粘滞位的深度解析

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...

w005基于Springboot学生心理咨询评估系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…...

实战-任意文件下载

实战-任意文件下载 1、开局 开局一个弱口令,正常来讲我们一般是弱口令或者sql,或者未授权 那么这次运气比较好,直接弱口令进去了 直接访问看看有没有功能点,正常做测试我们一定要先找功能点 发现一个文件上传点,不…...

PG数据库之视图详解

1. 视图的基本定义 在PostgreSQL(简称pg)数据库中,视图(View)是一种虚拟表,其内容由SQL查询定义。视图并不实际存储数据,而是在每次查询时根据定义的查询语句动态生成结果。视图可以简化复杂的…...

时间序列预测(十五)——有关Python项目框架的实例分析

#1024程序员节|征文# 在之前的学习中,已经对时间序列预测的相关内容有了大致的了解。为了进一步加深理解,并能够将所学知识应用于实际中,我决定找一个完整的Python框架来进行深入学习。经过寻找,我终于找到了一篇非常具…...

ETL、ELT和反向ETL都有什么不同?怎么选择?

数据处理是现代企业中不可或缺的一部分。随着数据量的不断增长,如何高效地处理、转换和加载数据变得尤为重要。本文将介绍三种常见的数据处理方式:ETL、ELT和反向ETL,帮助读者更好地理解和选择适合自己业务需求的方式。 一、ETL 定义&#…...

linux 中文实用型手册 基于RHEL(红帽系)

硬件系统 Updated by wangjing on 2024-10-28 at 02:36:57 in Tongzhou District, Beijing. 硬件信息 机器型号 dmidecode | grep "Product Name"CPU型号 cat /proc/cpuinfo |grep "model name" | uniqWWWCPU详情 lscpuCPU个数 cat /proc/cpuinfo |grep &q…...

Hash表算法

哈希表 理论知识(本文来自于代码随想录摘抄)什么是哈希常见的三种哈希结数组:set:map:其他常用方法或者技巧(自己总结的) 练习题和讲解有效的字母移位词349. 两个数组的交集1. 两数之和454. 四数相加 II15. 三数之和 总…...

MySQL企业常见架构与调优经验分享

文章目录 一、选择 PerconaServer、MariaDB 还是 MYSQL二、常用的 MYSQL 调优策略三、MYSOL 常见的应用架构分享四、MYSOL 经典应用架构 观看学习课程的笔记,分享于此~ 课程:MySQL企业常见架构与调优经验分享 mysql官方优化文档 调优MySQL参数 一、选择 …...

C++引用类型变量

引用变量的主要用途是用作函数的形参。这样函数将使用原始数据,而不是副本。除指针之外,引用也为处理大型结构提供了一种非常方便的途径。 再C中使用&符号标识引用。也就是说C给&符号赋予了另一个含义,将其用来声明引用。 引用的声…...

《C++23 新特性:现代软件开发的变革力量》

在软件开发的快速演进中,C作为一种强大且广泛应用的编程语言,不断推陈出新以适应日益复杂的开发需求。C23 的到来,为现代软件开发带来了诸多新的机遇和挑战。它的新特性不仅影响着开发者的编程习惯,也在代码效率、可维护性以及软件…...

Educational Codeforces Round 88 E. Modular Stability

题目链接 Educational Codeforces Round 88 E. Modular Stability 思路 对于任意的非负整数 x x x&#xff0c;我们要满足 x % a % b x % b % a x \% a \% b x \% b \% a x%a%bx%b%a。因为 a < b a < b a<b&#xff0c;所以只有 b b b为 a a a的倍数时才满足条件…...

Android中SurfaceView与GLSurfaceView 的关系

SurfaceView 与 GLSurfaceView 的关系 在 Android 开发中&#xff0c;SurfaceView 和 GLSurfaceView 是实现自定义渲染效果的关键组件。它们提供了不同的渲染方式&#xff0c;适用于不同的应用场景。我们将通过以下几个方面详细说明 SurfaceView 和 GLSurfaceView 的特点及实现…...

numpy——数学运算

一、标量——矢量 import numpy as npa 3.14 b np.array([[9, 5], [2, 7]])print(a) print(b)# ---------- 四则运算 ---------- print(a b) # np.add print(a - b) # np.subtract print(a * b) # np.multiply print(a / b) # np.divide 二、矢量——矢量 import nump…...

【工具】Charles对360浏览器抓包抓包

Charles 和 switchy sharp 配合&#xff0c;可以对 Chrome 进行抓包也可以配合对360安全浏览器抓包。 本文以Windows 电脑中的配置为例&#xff0c;介绍如何实现抓包。&#xff08;Mac中操作基本一致&#xff09; 1.安装Charles 可根据自己的电脑下载对应的版本&#xff1a;…...

【HarmonyOS】判断应用是否已安装

【HarmonyOS】判断应用是否已安装 前言 在鸿蒙中判断应用是否已安全&#xff0c;只是通过包名是无法判断应用安装与否。在鸿蒙里新增了一种判断应用安装的工具方法&#xff0c;即&#xff1a;canOpenLink。 使用该工具函数的前提是&#xff0c;本应用配置了查询标签querySch…...

Qt Designer客户端安装和插件集(pyqt5和pyside2)

GitHub - PyQt5/QtDesignerPlugins: Qt Designer PluginsQt Designer Plugins. Contribute to PyQt5/QtDesignerPlugins development by creating an account on GitHub.https://github.com/PyQt5/QtDesignerPlugins 一、下载客户端 https://github.com/PyQt5/QtDesigner/rel…...

基于边缘计算的智能门禁系统架构设计分析

案例 阅读以下关于 Web 系统架构设计的叙述&#xff0c;回答问题1至问题3。 【说明】 某公司拟开发一套基于边缘计算的智能门禁系统&#xff0c;用于如园区、新零售、工业现场等存在来访被访业务的场景。来访者在来访前&#xff0c;可以通过线上提前预约的方式将自己的个人信息…...

鸿蒙实现相机拍照及相册选择照片

前言&#xff1a; 1.如果你的应用不是存储类型或者相机拍照类型&#xff0c;你就需要用 kit.CameraKit Api 实现相机拍照和相册选择照片功能&#xff0c;如果你不用这个的话&#xff0c;你使用 picker.PhotoViewPicker &#xff0c;你就需要申请权限&#xff0c;那你提交应用审…...

「C/C++」C++17 之 std::filesystem::recursive_directory_iterator 目录及子目录迭代器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

智能EDA小白从0开始 —— DAY30 冉谱微RFIC-GPT

在科技日新月异的今天&#xff0c;电子设计自动化&#xff08;EDA&#xff09;行业正以前所未有的速度推动着半导体产业的革新与发展&#xff0c;引领着全球电子产业迈向更加智能化、高效化的未来。作为EDA领域的佼佼者&#xff0c;冉谱公司始终站在技术创新的前沿&#xff0c;…...

Android -- 调用系统相册之图片裁剪保存

前言 最近线上反馈&#xff0c;部分vivo手机更换头像时调用系统相册保存图片失败&#xff0c;经本人测试&#xff0c;确实有问题。 经修复后&#xff0c;贴出这块的代码供小伙伴们参考使用。 功能 更换头像选择图片&#xff1a; 调用系统相机拍照&#xff0c;调用系统图片…...

读《道德经》让人感到心胸气闷?董仲舒篡改

为什么读《道德经》会让人感到心胸气闷&#xff1f;难道是董仲舒篡改所致&#xff1f; 作为世界智慧源头的《老子》&#xff0c;享誉古今中外&#xff0c;是世界历史上最伟大的著作之一。 然而&#xff0c;很多人读《道德经》时会感到心胸气闷&#xff0c;这究竟是为什么呢&am…...

D52【python 接口自动化学习】- python基础之模块与标准库

day52 标准库 学习日期&#xff1a;20241029 学习目标&#xff1a;模块与标准库 -- 67 标准库&#xff1a;Python默认提供的便携功能有哪些&#xff1f; 学习笔记 标准库中的常见组件 如何通过官方文档学习标准 from urllib.request import urlopen with urlopen(http://ww…...

基于yolov8的布匹缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的布匹缺陷检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的布匹缺陷检测系统是在 PyTo…...

SQL Server 中,将单行数据转换为多行数据

在 SQL Server 中&#xff0c;将单行数据转换为多行数据通常涉及到将某个字段中的逗号分隔的值拆分成多行。这种操作通常称为“拆分”或“展开”&#xff08;Explode&#xff09;。以下是一些常用的方法来实现这一目标&#xff1a; 1. 使用内置函数 STRING_SPLIT 从 SQL Serv…...

解决数组两数之和问题与逻辑推理找出谋杀案凶手

给定一个整数数组nums和一个整数目标值target(2<nums.length<10^4)&#xff0c;请你在该数组中找出和为目标值target 的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返…...

uniapp的IOS证书申请(测试和正式环境)及UDID配置流程

1.说明 本教程只提供uniapp在ios端的证书文件申请&#xff08;包含正式环境和开发环境&#xff09;、UDID配置说明&#xff0c;请勿用文档中的账号和其他隐私数据进行测试&#xff0c;请勿侵权&#xff01; 2.申请前准备 证书生成网站&#xff1a;苹果应用上传、解析&#x…...

windows 安装apex_Nvidia Apex安装

参见windows 安装apex_Nvidia Apex安装 重点&#xff1a; 1、在安装前先检查一下&#xff0c;电脑的cuda版本和pytorch内的cuda版本是否一样&#xff0c;不一样的话就把低版本的进行升级&#xff1b; $ git clone https://github.com/NVIDIA/apex$ cd apex2、在保证cuda版本一…...

杭州做兼职网站/百度怎么推广产品

with打开文件的用法&#xff0c;打开运行完后&#xff0c;不管有没有错&#xff0c;都会自动关闭 with open("a.txt","r") as f: xf.read() print(x) with open("a.txt","w") as f: f.write("456") raise的作…...

买个域名自己做网站吗/苏州网站建设公司排名

近期看一个音频传输代码时&#xff0c;对方采用了LinkedBlockingQueue为生产者、消费者模式&#xff0c;来支撑读写线程。 个人感觉非常不错&#xff0c;因此也对这种方式进行总结&#xff0c;并梳理了一个基本的功能框架备用。主要两点&#xff1a; 1、当对queue采用take操作…...

旅游网站的建设方案/首页关键词优化价格

1.VLAN规划。 通常&#xff0c;不同的部门规划不同的vlan&#xff0c;如上图PC1和PC2属于同一个VLAN&#xff0c;PC3和打印机属于同一VLAN下&#xff1a; 部门VLANPC1 、PC210PC3 &#xff0c;打印机20 交换机上创建vlan&#xff0c;主机互联的接口配置为access接口&#xff…...

手机网站制作相关文章/郴州网站seo外包

原因 在插入mongodb时&#xff0c;插入的是同一个字典对象字典对象字典对象&#xff0c;所以 _id重复&#xff0c;报错&#xff01; 解决 只需每次创建文档字典时&#xff0c;都新建一个字典对象即可...

ASP.NET与网站开发实践教程/百度链接

3.3V升5V电流3A-5A同步整流升压芯片&#xff0c;2.7V到18V的输入电压支持供电系统和电池的较宽范围应用。FH30502根据负载情况的变化自动切换工作模式&#xff0c;在轻载Burst模式下静态电流处于低状态。FH30502使用自适应常数断开时间峰值电流模式控制。FH30502有一个内部特性…...

免费动态网站成品作业/惊艳的网站设计

隐写篇0x01. 通过进制转换隐藏信息0x02. 在图片中隐藏压缩包(图种)加密篇0x03. 伪加密0x04. 爆破/字典/掩码攻击0x05. 明文攻击0x06. CRC32碰撞格式篇0x07. 修改格式0x01. 通过进制转换隐藏信息这种方法比较简单&#xff0c;直接拿一道题讲解(题目来自ISCC 2017 Basic-04)。题目…...