JVM虚拟机篇(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解

JVM垃圾回收器全面解析与G1深度探秘及四种引用详解

  • JVM虚拟机(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解
    • 一、JVM有哪些垃圾回收器
      • 1. Serial回收器
      • 2. ParNew回收器
      • 3. Parallel Scavenge回收器
      • 4. Serial Old回收器
      • 5. Parallel Old回收器
      • 6. CMS(Concurrent Mark Sweep)回收器
      • 7. G1(Garbage-First)回收器
    • 二、详细聊一下G1垃圾回收器
      • 3.6.1 概述
      • 3.6.2 Young Collection(年轻代垃圾回收)
      • 3.6.3 Young Collection + Concurrent Mark(年轻代垃圾回收 + 并发标记)
      • 3.6.4 Mixed Collection(混合垃圾回收)
    • 三、强引用、软引用、弱引用、虚引用的区别
      • 3.7.1 强引用(Strong Reference)
      • 3.7.2 软引用(Soft Reference)
      • 3.7.3 弱引用(Weak Reference)
      • 3.7.4 虚引用(Phantom Reference)

JVM虚拟机(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解

一、JVM有哪些垃圾回收器

在Java虚拟机(JVM)中,垃圾回收器负责自动管理内存,回收不再使用的对象所占用的内存空间。不同的垃圾回收器具有不同的特点和适用场景,以下是常见的JVM垃圾回收器:

1. Serial回收器

  • 特点:单线程垃圾回收器,在进行垃圾回收时,会暂停所有用户线程(Stop-The-World,STW)。它简单高效,对于单线程环境或小型应用程序有较好的性能表现。
  • 适用场景:Client模式下的小型应用,对内存要求不高,单核CPU环境。

2. ParNew回收器

  • 特点:Serial回收器的多线程版本,允许多个线程同时进行垃圾回收,同样会产生STW。它常与CMS回收器配合使用,是Server模式下新生代回收的常用选择之一。
  • 适用场景:Server模式,多核CPU环境,与CMS配合时的新生代回收。

3. Parallel Scavenge回收器

  • 特点:关注吞吐量的垃圾回收器,通过最大化吞吐量来提高程序的运行效率。它也是多线程回收器,可通过参数控制吞吐量目标。
  • 适用场景:后台任务、对响应时间要求不高但重视吞吐量的应用,如批量数据处理。

4. Serial Old回收器

  • 特点:Serial回收器的老年代版本,单线程回收,使用标记-整理算法。通常作为其他回收器的后备方案,在JVM内存较小、单核环境下仍有一定应用。
  • 适用场景:与Serial回收器配合,或作为Parallel Scavenge老年代回收的后备。

5. Parallel Old回收器

  • 特点:Parallel Scavenge的老年代版本,多线程,采用标记-整理算法,提供与Parallel Scavenge类似的吞吐量优先特性。
  • 适用场景:注重吞吐量的应用,老年代回收,与Parallel Scavenge配合。

6. CMS(Concurrent Mark Sweep)回收器

  • 特点:以获取最短回收停顿时间为目标的回收器,采用标记-清除算法。它能在垃圾回收时与用户线程并发执行部分操作,减少STW时间。
  • 优点:响应速度快,适合对响应时间要求高的应用,如Web应用。
  • 缺点:会产生内存碎片,并发阶段可能因用户线程继续运行导致重新标记,且对CPU资源敏感。
  • 适用场景:B/S架构等对响应时间敏感的应用。

7. G1(Garbage-First)回收器

  • 特点:新一代垃圾回收器,将堆内存划分为多个大小相等的Region,采用分代收集思想,但不再有固定的新生代和老年代。它能更精确地控制垃圾回收的停顿时间,同时兼顾吞吐量和响应时间。
  • 适用场景:大内存、多处理器环境,对停顿时间有严格要求的应用,是JDK 9及以上的默认回收器。

二、详细聊一下G1垃圾回收器

3.6.1 概述

G1(Garbage-First)回收器是一种面向服务器的垃圾回收器,旨在满足高吞吐量和低停顿时间的需求。与传统回收器不同,G1将堆内存划分为大量大小相等的Region(区域),每个Region可以动态地扮演新生代或老年代的角色。G1通过维护一个优先列表,每次根据允许的停顿时间优先回收垃圾最多的Region,这也是其名称“Garbage-First”的由来。这种设计使得G1能更灵活地控制垃圾回收的停顿时间,同时提高内存的利用率和回收效率。

3.6.2 Young Collection(年轻代垃圾回收)

  • 回收过程:当新生代的Eden区填满时,触发Young Collection。G1采用复制算法,将Eden区和Survivor区中存活的对象复制到另一个空的Survivor区或晋升到老年代(如果对象年龄达到阈值)。此时会产生STW,但由于新生代对象存活率通常较低,复制操作的开销相对较小。
  • 特点:快速处理新生代大量短生命周期的对象,通过多线程并行执行,减少回收时间。

3.6.3 Young Collection + Concurrent Mark(年轻代垃圾回收 + 并发标记)

  • 并发标记阶段
    • 初始标记(Initial Mark):STW,标记GC Roots直接引用的对象,时间很短。
    • 并发标记(Concurrent Mark):与用户线程并发执行,从GC Roots开始遍历对象图,标记存活的对象。
    • 最终标记(Final Mark):STW,处理并发标记阶段遗留的少量对象,确保标记准确。
    • 筛选回收(Live Data Counting and Evacuation):计算每个Region的存活对象和可回收空间,为混合回收做准备。
  • 与Young Collection的配合:在年轻代回收后,通过并发标记确定老年代中哪些Region含有较多垃圾,为后续的混合回收提供依据。

3.6.4 Mixed Collection(混合垃圾回收)

  • 回收过程:G1根据筛选回收阶段的统计信息,选择垃圾比例较高的老年代Region,结合新生代Region一起回收。回收时采用复制算法,将存活对象复制到空的Region中,从而清理掉垃圾较多的Region。
  • 特点:在控制停顿时间的前提下,逐步回收老年代的垃圾,避免老年代内存碎片化,同时提高整体内存的利用率。

三、强引用、软引用、弱引用、虚引用的区别

3.7.1 强引用(Strong Reference)

  • 定义:程序中最常见的引用方式,如Object obj = new Object();,obj就是一个强引用。
  • 回收时机:只要强引用存在,垃圾回收器永远不会回收被引用的对象。即使内存不足,JVM也会抛出OutOfMemoryError而不会回收强引用对象。
  • 应用场景:大多数普通对象的引用,确保对象在需要时始终存在。

3.7.2 软引用(Soft Reference)

  • 定义:通过SoftReference类实现,如SoftReference<Object> softRef = new SoftReference<>(new Object());
  • 回收时机:当内存不足时,垃圾回收器会回收软引用所引用的对象。软引用通常用于实现缓存,在内存充足时保留对象,内存紧张时释放以避免OOM。
  • 应用场景:图片缓存、网页缓存等,允许在内存不足时释放非关键对象。

3.7.3 弱引用(Weak Reference)

  • 定义:通过WeakReference类实现,WeakReference<Object> weakRef = new WeakReference<>(new Object());
  • 回收时机:只要发生垃圾回收,无论内存是否充足,弱引用所引用的对象都会被回收。弱引用的生命周期更短。
  • 应用场景:临时对象、对生命周期要求较短的辅助对象,如哈希表中的弱引用键值对,避免内存泄漏。

3.7.4 虚引用(Phantom Reference)

在这里插入图片描述

  • 定义:通过PhantomReference类实现,且必须配合ReferenceQueue使用,PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), referenceQueue);在这里插入图片描述

  • 回收时机:虚引用随时可能被垃圾回收器回收,它主要用于跟踪对象的垃圾回收状态,而不是实际引用对象。

  • 应用场景:对象回收后的资源释放等特殊场景,如直接内存的释放跟踪。

通过对JVM垃圾回收器的全面了解,尤其是G1回收器的深入剖析,以及四种引用类型的详细对比,开发者能更好地理解Java内存管理机制,优化程序性能,避免内存相关的问题,编写出更高效、稳定的Java应用程序。

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

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

相关文章

革新电销流程,数企云外呼开启便捷 “直通车”

在当今竞争激烈的商业环境中&#xff0c;电销作为一种重要的营销手段&#xff0c;依旧在企业的客户拓展与业务增长中扮演着关键角色。然而&#xff0c;传统电销流程常常面临诸多困扰&#xff0c;像是封卡封号风险、接通率不理想、客户开发与管理艰难以及销售考核复杂等问题&…

适合工程建筑行业的OA系统有什么推荐?

工程行业具有项目周期长、协作链条复杂等特性&#xff0c;传统管理模式下的 “人治”“纸质化” 弊端日益凸显。OA 系统作为数字化管理的核心载体&#xff0c;通过流程标准化、数据可视化&#xff0c;精准解决工程行业项目管理核心痛点。 泛微 e-office 深度聚焦工程场景&#…

车载刷写架构 --- ECU收到相同的blockSequenceCounter数据包的思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

C++ RAII 的用途及业务代码实现案例

C RAII 的用途及业务代码实现案例 RAII 的核心概念 RAII (Resource Acquisition Is Initialization&#xff0c;资源获取即初始化) 是 C 的核心编程范式&#xff0c;其核心思想是&#xff1a; 资源获取与对象构造绑定资源释放与对象析构绑定利用 C 对象生命周期自动管理资源…

黑马 SpringAI+DeepSeek 实战:从对话机器人到企业级知识库的大模型开发全攻略

附完整代码 项目案例&#xff0c;3 天吃透大模型应用开发核心技术 需要完整项目学习视频以及源码的私信博主&#xff0c;谢谢~大家一起加油呐&#xff01;&#xff01; 01.认识AI和大模型 小结 AI的发展过程 符号主义 机器学习 深度学习——自然语言处理&#xff08;NLP…

共工新闻社与韩国新华报社达成合作

在当下媒体融合浪潮奔涌的时代背景下&#xff0c;大湾区经济网战略媒体香港共工新闻社与韩国新华报社顺利签署合作协议&#xff0c;携手为传播全球化进程以及海外华文媒体从单一媒体向多媒体的内涵拓展&#xff0c;乃至区域经济协同与文化融合发展贡献力量。 缔结友好华文媒体协…

嵌入式Linux驱动——3 总线设备驱动模型

目录 1.总线设备驱动模型 1.1 总线设备驱动模型 1.2 设备树 1.3 platform_device 和 platform_driver 的匹配规则 1.3.1 最先比较 1.3.2 然后比较 1.3.3 最后比较 2.LED 模板驱动程序的改造&#xff1a;总线设备驱动模型 1.总线设备驱动模型 在前面的 led 驱动程序中…

操作系统常用命令

逻辑卷创建及挂载步骤&#xff1a; vgcreate vg_app /dev/sda //在sda盘上创建vg_app卷组 lvcreate -L 50G -n lv_mysql vg_app //在vg_app卷组上创建逻辑卷lv_mysql mkfs.xfs /dev/vg_app/lv_mysql //对lv_mysql 逻辑卷创建文件系统 mkdir mysql //创建mysql目录 ech…

Git 的进阶功能和技巧

1、分支的概念和使用 1.1、什么是分支&#xff1f; 分支&#xff08;Branch&#xff09;是在版本控制中非常重要的概念。几乎所有版本控制系统都支持某种形式的分支。在 Git 中&#xff0c;分支是 Git 强大功能之一&#xff0c;它允许我们从主开发线分离出来&#xff0c;在不…

mapbox基础,加载F4Map二维地图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性二、🍀F4Map 简介2.1 ☘️技术特点2.2 ☘️核…

Conda使用方法详解

Conda是一个开源的包管理和环境管理系统&#xff0c;主要用于Python/R等科学计算领域&#xff0c;可以轻松管理不同项目的依赖关系。以下是Conda的详细使用方法&#xff1a; 一、安装与配置 1.安装Miniconda/Anaconda Miniconda是精简版&#xff0c;只包含conda和Python Ana…

Unity ViewportConstraint

一、组件功能概述 ViewportConstraint是一个基于世界坐标的UI边界约束组件&#xff0c;主要功能包括&#xff1a; 将UI元素限制在父容器范围内支持自定义内边距&#xff08;padding&#xff09;可独立控制水平和垂直方向的约束 二、实现原理 1. 边界计算&#xff08;世界坐…

代码随想录-动态规划24

leetcode-300-最长递增子序列 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 dp[j]是(0,i-1)不包括i的以nums[i-1]结尾的最长递增子序列长度 int lengthOfLIS(int* nums, int numsSize) {if(numsSize < 1)return numsSize;int dp[numsSize];for(int i 0 ; i &…

银河麒麟V10 Ollama+ShellGPT打造Shell AI助手——筑梦之路

环境说明 1. 操作系统版本: 银河麒麟V10 2. CPU架构&#xff1a;X86 3. Python版本&#xff1a;3.12.9 4. 大模型&#xff1a;mistral:7b-instruct 准备工作 1. 编译安装python 3.12 # 下载python 源码wget https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tg…

2025 跨平台技术如何选:KMP 与 Flutter 的核心差异

前言 在移动开发的演进历程中&#xff0c;跨平台技术始终是一个充满争议却无法回避的话题。从早期的 React Native 到如今的 Kotlin Multiplatform&#xff08;KMP&#xff09;和 Flutter&#xff0c;开发者们始终在代码复用与原生体验之间寻找平衡。本文我们从技术实现、性能…

Python Cookbook-5.10 选取序列中最小的第 n个元素

任务 需要根据排名顺序从序列中获得第n个元素(比如&#xff0c;中间的元素&#xff0c;也被称为中值)。如果序列是已经排序的状态&#xff0c;应该使用seq[n]&#xff0c;但如果序列还未被排序&#xff0c;那么除了先对整个序列进行排序之外&#xff0c;还有没有更好的方法? …

列表之链表_C

数据结构&#xff08;邓俊辉&#xff09;&#xff1a;列表及相关概念_listnodeposi-CSDN博客 #include <stdio.h> #include <stdlib.h>// 定义Rank类型为int typedef int Rank;// 定义ListNode结构体 typedef struct ListNode {int data;struct ListNode* pred;st…

0401react中使用css-react-css-仿低代码平台项目

文章目录 1、普通方式-内联使用css2、引入css文件2.1、示例2.2、classnames 3、内联css与引入css文件对比3.1、内联css3.2、 外部 CSS 文件&#xff08;External CSS&#xff09; 4、css module5、sass6、classnames组合scss modules7、css-in-js7.1、CSS-in-JS 的核心特性7.2、…

鸿蒙开发者高级认证编程题库

题目一:跨设备分布式数据同步 需求描述 开发一个分布式待办事项应用,要求: 手机与平板登录同一华为账号时,自动同步任务列表任一设备修改任务状态(完成/删除),另一设备实时更新任务数据在设备离线时能本地存储,联网后自动同步实现方案 // 1. 定义分布式数据模型 imp…

stream流Collectors.toMap(),key值重复问题

文章目录 一、问题二、问题示例三、原因四、解决方法4.1、方案一 一、问题 发现Collectors.toMap的一个坑&#xff0c;若key值重复的时候会抛异常。如&#xff1a; IllegalStateException: Duplicate key 男 二、问题示例 报错示例如下&#xff1a; import lombok.AllArgsC…