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

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

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

我回答:

1. Serial收集器

  • 特点:Serial收集器是最古老、最稳定的收集器,它使用单个线程进行垃圾收集工作。在进行垃圾回收时,它会暂停所有用户线程,即Stop The World(STW)。
    • 单线程工作,适合单核 CPU。
    • 在年轻代(Young Generation)中使用,称为 Serial。
    • 在老年代(Old Generation)中使用,称为 Serial Old。
    • 收集速度快,但会暂停整个应用。
    • 适合小型应用或测试环境。
  • 应用场景:适用于单CPU环境或内存较小、对停顿时间要求不高的应用。
  • 回收算法
    • 在新生代,它采用复制算法,将新生代划分为一个 Eden 区和两个 Survivor 区,默认比例是 8:1:1。在垃圾回收时,将 Eden 区和其中一个 Survivor 区中存活的对象复制到另一个 Survivor 区。
    • 在老年代,它采用标记 - 整理算法,对存活对象进行标记后,将其移动到一端,清除另一端的垃圾。

2. ParNew收集器

  • 特点:ParNew收集器是Serial收集器的多线程版本,也被称为“并行年轻代收集器”。它可以与CMS收集器配合使用,以实现更短的停顿时间。
    • 多线程工作,适合多核 CPU。
    • 在年轻代中使用,称为 ParNew 或者 Parallel。
    • 专注于吞吐量优化。
    • 使用复制算法(Copy)或标记-压缩算法(Mark-Compact)。
    • 适合需要高吞吐量的应用。
  • 应用场景:适用于多CPU环境,特别是需要缩短年轻代垃圾回收停顿时间的应用。
  • 回收算法
    • 在新生代采用复制算法,其内存区域划分和 Serial 回收器相同,也是 Eden 区和两个 Survivor 区。

3. Parallel收集器(Parallel Scavenge)

  • 特点:Parallel收集器是一种多线程并行的垃圾收集器,它关注点是吞吐量(运行用户代码时间与CPU总消耗时间的比值)。它同样适用于新生代和老年代的回收。
  • 应用场景:适用于对吞吐量有较高要求的应用,如后台计算任务等。
  • 回收算法
    • 在新生代采用复制算法,通过参数调整可以控制新生代的大小、Survivor 区比例等内存分配策略,以优化吞吐量。

4. CMS(Concurrent Mark-Sweep)收集器

  • 特点:CMS收集器是一种以获取最短回收停顿时间为目标的收集器。它是第一款并发收集器,可以实现垃圾收集线程与用户线程同时工作。但需要注意的是,CMS收集器对CPU资源敏感,且无法处理浮动垃圾,还可能产生大量空间碎片。
    • 并发标记和清扫,减少暂停时间。
    • 专注于降低停顿时间。
    • 使用标记-清除算法(Mark-Sweep)。
    • 可能会产生碎片。
    • 适合对响应时间敏感的应用。
  • 应用场景:适用于对停顿时间有严格要求的应用,如Web服务等。

5. G1(Garbage-First)收集器

  • 特点:G1收集器是一种面向服务端应用的垃圾收集器,它逐步取代了CMS收集器。G1收集器具有更可控的停顿时间和高效的并发能力。它将堆内存划分为多个大小相等的独立区域(Region),并根据对象的存活周期和垃圾回收的优先级来选择要回收的区域。
    • 设计目标是在控制 GC 停顿时间的同时获得高吞吐量。
    • 使用分区(Region)的概念,将堆划分为多个小块。
    • 并发执行,适合大堆(Large Heap)。
    • 自适应调整策略,自动选择最优的收集时机。
    • 适合对停顿时间和吞吐量都有较高要求的应用。
  • 应用场景:适用于对停顿时间和吞吐量都有较高要求的大型应用。
  • 回收过程及算法
    • 初始标记(Initial Mark):需要暂停所有用户线程,标记从 GC Roots 能直接关联到的对象,时间很短。
    • 并发标记(Concurrent Mark):与用户线程并发执行,对堆中对象进行可达性分析,标记存活对象。
    • 最终标记(Final Mark):需要暂停所有用户线程,处理并发标记阶段遗留的少量的 SATB(Snapshot - At - The - Beginning)记录。
    • 筛选回收(Live Data Counting and Evacuation):对各个区域的回收价值和成本进行排序,根据设定的停顿时间,选择部分区域进行回收,回收过程中采用复制算法,将存活对象复制到新的区域。

6. ZGC Collector(Z Garbage Collector)

  • 特点
    • 专注于极低的 GC 停顿时间。
    • 使用并行与并发技术。
    • 适合非常大的堆(数 TB)。
    • 适用于需要极高响应时间的应用。
    • 从 Java 11 开始引入。

7. Shenandoah Collector

  • 特点
    • 类似于 ZGC,专注于极低的 GC 停顿时间。
    • 使用并行与并发技术。
    • 适合需要极高响应时间的应用。
    • 从 Java 9 开始作为实验性功能,Java 12 作为正式功能引入。

8. Parallel Old Collector

  • 特点
    • 与 Parallel Collector 配合使用。
    • 在老年代中使用,称为 Parallel Old。
    • 适用于需要高吞吐量的应用。
  • 回收算法
    • 采用标记 - 整理算法进行老年代垃圾回收。

9. Serial Old Collector

  • 特点

    • 与 Serial Collector 配合使用。
    • 在老年代中使用,称为 Serial Old。
    • 适用于小型应用或测试环境。
  • 适用场景

    • 主要用于 Client 模式下的老年代垃圾回收,或者在 Server 模式下与 Parallel Scavenge 回收器搭配使用,用于处理 CMS 回收器产生的垃圾碎片等情况。
  • 回收算法

    • 采用标记 - 整理算法进行老年代垃圾回收。

10. Concurrent Mark Sweep Collector (CMS)

  • 特点
    • 已经在 Java 9 中被标记为废弃,并在 Java 14 中被移除。
    • 曾经用于降低停顿时间,但在现代 JVM 中已经被 G1 等更先进的收集器取代。
  • 回收过程及算法
    • 初始标记(Initial Mark):需要暂停所有用户线程,标记从 GC Roots 能直接关联到的对象,速度很快。
    • 并发标记(Concurrent Mark):可以与用户线程并发执行,从初始标记的对象开始,遍历整个老年代,标记所有存活的对象。
    • 重新标记(Remark):需要暂停所有用户线程,修正并发标记期间因用户线程继续运行而导致标记变动的那部分对象的标记记录,这个阶段的停顿时间比初始标记长,但远比并发标记短。
    • 并发清除(Concurrent Sweep):与用户线程并发执行,清除未被标记的垃圾对象。
    • 整体采用标记 - 清除算法,在并发清除阶段会产生一定的内存碎片。

垃圾回收算法简介

为了更好地理解垃圾回收器的工作原理,以下是几种常见的垃圾回收算法的简要介绍:

  • 标记-清除算法:该算法分为标记和清除两个阶段。在标记阶段,垃圾回收器会从GC Roots开始遍历所有可达的对象,并标记它们为活动对象。在清除阶段,垃圾回收器会遍历整个堆,回收所有未被标记的对象的内存。但这种方法可能会产生大量不连续的内存碎片。
  • 标记-整理算法:该算法是标记-清除算法的改进版本。它在标记和清除的基础上增加了整理阶段,将所有活动对象向一端移动,从而消除内存碎片。但这种方法可能会增加额外的开销。
  • 复制算法:该算法通常用于新生代垃圾回收。它将内存分为Eden空间和两个Survivor空间。在垃圾回收时,将还存活的对象复制到另一个Survivor空间或老年代中,然后清空当前使用的空间。这种方法可以减少内存碎片的产生,但可能会浪费一定的空间。

总结

选择合适的垃圾回收器需要根据应用程序的具体需求和运行环境进行权衡。以下是一些选择垃圾回收器时需要考虑的因素:

  • 内存大小:对于大内存应用,G1和CMS可能是更好的选择。
  • 吞吐量:如果对吞吐量有较高要求,Parallel GC是较好的选择。
  • 停顿时间:对于对响应时间要求较高的应用,CMS和G1可能更合适。
  • CPU资源:并行和并发垃圾收集器会占用额外的CPU资源来进行垃圾回收工作。如果应用程序本身已经对CPU资源有较高的需求,那么需要谨慎选择垃圾收集器,以避免对应用程序性能造成过大影响。
  • 垃圾产生速度:如果应用程序产生垃圾的速度非常快,那么需要选择能够高效处理大量垃圾的收集器,如G1或Parallel GC。
  • JVM版本:不同版本的JVM可能支持不同的垃圾收集器,且同一收集器在不同版本中的表现也可能有所不同。因此,在选择垃圾收集器时,还需要考虑JVM的版本兼容性。

垃圾收集器的调优是一个复杂的过程,需要根据具体的应用场景和性能目标进行调整。以下是一些常见的调优策略:

  • 设置合适的堆内存大小:堆内存设置过大或过小都会影响垃圾收集器的性能。过大可能导致垃圾回收时间过长,过小则可能频繁触发垃圾回收。因此,需要根据应用程序的内存需求来设置合适的堆内存大小。

JVM的垃圾回收器有多种类型,每种类型都有其特定的应用场景和优势。在选择垃圾回收器时,需要根据应用的特点和需求进行权衡和选择。同时,了解垃圾回收算法的基本原理也有助于更好地理解垃圾回收器的工作原理和优化策略。

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

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

相关文章

线性表之双向链表

链表花里胡哨,一应俱全 前言 在这之前,我们已经学习了单链表。我们发现这些链表都是一个接一个朝一个方向接下去,有时,我们想要查找某个结点的时候还得从头开始遍历查找,尽管我们已经学习了顺序表,查找某个…

免费PDF页面提取小工具

下载地址 https://download.csdn.net/download/woshichenpi/89922797 使用说明:PDF页面提取工具 1. 启动应用程序 双击程序的启动图标或者通过命令行运行程序。 2. 选择PDF文件 在应用程序窗口中找到“选择PDF”按钮并点击它。在弹出的文件选择对话框中&#x…

Windows server 2003服务器的安装

Windows server 2003服务器的安装 安装前的准备: 1.镜像SN序列号 图1-1 Windows server 2003的安装包非常人性化 2.指定一个安装位置 图1-2 选择好安装位置 3.启动虚拟机打开安装向导 图1-3 打开VMware17安装向导 图1-4 给虚拟光驱插入光盘镜像 图1-5 输入SN并…

Linux系统安装Redis详细操作步骤(二进制发布包安装方式)

安装方式介绍 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布,只要解压,修改配置即可rpm安装软件已经按照redhat的包管理规范进…

Redis 集群 总结

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 集群 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 集群 & 总结》(学习总结/最新最准/持续更新)《Redis & 集群…

计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议

文章目录 IPv4地址与MAC地址的封装位置IPv4地址与MAC地址的关系地址解析协议ARP工作原理ARP高速缓存表 IPv4地址与MAC地址的封装位置 在数据传输过程中,每一层都会添加自己的头部信息,最终形成完整的数据包。具体来说: 应用层生成的应用程序…

Java--反射机制

前言: 反射与之前的知识的区别 1.面向对象中创建对象,调用指定结构(属性、方法)等功能,可以不使用反射,也可以使用反射。请问有什么区别? 不使用反射,我们需要考虑封装性。比如:出了自定义类之后,就不能…

WPF+MVVM案例实战(六)- 自定义分页控件实现

文章目录 1、项目准备2、功能实现1、分页控件 DataPager 实现2、分页控件数据模型与查询行为3、数据界面实现 3、运行效果4、源代码获取 1、项目准备 打开项目 Wpf_Examples,新建 PageBarWindow.xaml 界面、PageBarViewModel.cs ,在用户控件库 UserControlLib中创建…

电池的主被动均衡

只有串联的电池需要进行电压均衡,并联的电池由于电压一致,所以并不需要进行均衡: 被动均衡有一个很明显的特征就是会看到很多大电阻,串联在MOS和电池之间:下图中的保护板就是被动均衡板子以及它的原理图: …

软硬件开发面试问题大汇总篇——针对非常规八股问题的提问与应答

软硬件开发,从微控制器编程到复杂的嵌入式系统开发,离不开下位机、操作系统、上位机等,涵盖范围很广。 如何快速一行代码操作硬件寄存器 直接操作硬件寄存器的代码通常依赖于特定平台和编程语言。在 C 或 C 中,常见的方法是使用指…

WORFBENCH:一个创新的评估基准,目的是全面测试大型语言模型在生成复杂工作流 方面的性能。

2024-10-10,由浙江大学和阿里巴巴集团联合创建的WORFBENCH,一个用于评估大型语言模型(LLMs)生成工作流能力的基准测试。它包含了一系列的测试和评估协议,用于量化和分析LLMs在处理复杂任务时分解问题和规划执行步骤的能力。WORFBE…

智慧停车场导航系统架构及反向寻车系统解决方案

一、系统概述: 随着当前室内定位导航技术在大型公共场所如政务中心、商业综合体、车站中的应用越来越多,人们对智慧停车场的需求也日益凸显出来,并且智慧停车场对大型公共场所智慧化的整体建设起到重要作用。如何更有效提高停车效率&#xf…

如何加密电脑磁盘?电脑本地磁盘加密方法介绍

随着信息技术的不断发展,电脑磁盘加密已经成为保护个人隐私和数据安全的重要手段。本文将介绍几种常见的电脑本地磁盘加密方法,帮助用户保护自己的数据安全。 文件夹只读加密专家 文件夹只读加密专家不仅可以加密电脑中的文件夹,还可以加密保…

Android 13 SystemUI 隐藏下拉快捷面板部分模块(wifi,bt,nfc等)入口

frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java createTileInternal(tileSpec)方法注释想隐藏的模块即可。

【C++进阶篇】——STL的简介

【C进阶篇】——STL的简介 1.什么是STL STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 2.STL的版本 原始版本 Alexander Stepanov、Meng Lee 在…

redis集群配置

一、Redis集群的三种方式 Redis集群提供了三种分布式方案:主从模式:一个主节点和一个或多个从节点,主节点负责写操作,从节点负责读操作,实现读写分离,分担主节点的压力。哨兵模式:哨兵系统用于监…

【每日一题】LeetCode - 盛最多水的容器

给定一个长度为 n 的整数数组 height。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。要求找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 输入示例: height [1,8,6,2,5,4,8,3,7]输出: 4…

Python依赖库的几种离线安装方法

Python依赖库的几种安装方法 python经常需要安装一些依赖库,但是有时候环境可以连通python源,有时不能连通需要离线安装(安装单个库包或者整个库环境),使用pip的如下方法可以相对简单解决问题。 一、如何copy一个pyt…

Linux 端口占用 kill被占用的端口 杀掉端口

1、yum install lsof 2、输入netstat -tln,查看系统当前所有被占用端口 3、根据端口查询进程,输入lsof -i :9555,切记不要忘了添加冒号 4、 既然知道进程号了,那杀死当前进程就简单多了,直接 kill -9 PID 回车

如何通过企业架构蓝图引导企业实现数字化转型:构建与实施的全方位指南

在当今迅速变化的商业环境中,企业进行数字化转型已成为提升竞争力、优化运营的必要手段。企业架构蓝图(EA Blueprint)作为指导企业数字化转型的战略工具,不仅提供了系统化的设计和规划路径,还帮助企业在技术与业务目标…