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

news2025/4/19 5:56:01

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.coloradmin.cn/o/2331640.html

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

相关文章

柑橘病虫害图像分类数据集OrangeFruitDaatset-8600

文章目录 1. 前言2. 数据类别介绍3. 数据集地址 1. 前言 柑橘&#xff0c;作为水果界的 “宠儿”&#xff0c;不仅以其酸甜可口的味道深受大众喜爱&#xff0c;更是在全球水果产业中占据着举足轻重的地位。无论是早餐中的一杯橙汁&#xff0c;还是下午茶里的柑橘甜点&#xff…

深度学习总结(4)

张量积 张量积&#xff08;tensor product&#xff09;或点积&#xff08;dot product&#xff09;是最常见且最有用的张量运算之一。注意&#xff0c;不要将其与逐元素乘积&#xff08;*运算符&#xff09;弄混。在NumPy中&#xff0c;使用np.dot函数来实现张量积&#xff0c…

利用CST Microwave Studio设计贴片天线

利用CST Microwave Studio设计贴片天线的步骤如下&#xff0c;分为几个关键阶段&#xff1a; --- ### **1. 初始设置** - **新建项目**&#xff1a;打开CST&#xff0c;创建新项目&#xff08;File > New&#xff09;&#xff0c;选择“Antenna (Planar)”或“Microwave &…

STM32之SG90舵机控制(附视频讲解)

目录 前言&#xff1a; 一、硬件准备与接线 1.1 硬件清单 1.2 接线 二、 SG90舵机简介 1.1 外观 1.2 基本参数 1.3 引脚说明 1.4 控制原理 1.5 特点 1.6 常见问题 三、 单片机简介 四、 程序设计 4.1 定时器配置 4.2 角度控制函数 4.3 主函数调用 五、 总结 …

(1)英特尔 RealSense T265(三)

文章目录 前言 4.4 地面测试 4.5 飞行测试 4.6 室内外实验 4.7 数据闪存记录 4.8 启动时自动运行 4.9 使用 OpticalFlow 进行 EKF3 光源转换 前言 Realsense T265 通过 librealsense 支持 Windows 和 Linux 系统。不同系统的安装过程差异很大&#xff0c;因此请参阅 gi…

多模态大语言模型arxiv论文略读(七)

MLLM-DataEngine: An Iterative Refinement Approach for MLLM ➡️ 论文标题&#xff1a;MLLM-DataEngine: An Iterative Refinement Approach for MLLM ➡️ 论文作者&#xff1a;Zhiyuan Zhao, Linke Ouyang, Bin Wang, Siyuan Huang, Pan Zhang, Xiaoyi Dong, Jiaqi Wang,…

SQL ③-基本语法

SQL基本语法 表操作 创建表 CREATE TABLE table_name (column1 datatype constraint,column2 datatype constraint,column3 datatype constraint,... );删除表 DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name...];TEMPORARY&#xff1a;表示临时表&#xff…

esp32cam -> 服务器 | 手机 -> 服务器 直接服务器传输图片

服务器先下载python &#xff1a; 一、Python环境搭建&#xff08;CentOS/Ubuntu通用&#xff09; 一条一条执行 安装基础依赖 # CentOS sudo yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel # Ubuntu sudo apt update && sudo apt install b…

豆浆机语音提示芯片方案:基于可远程在线更换语音的WT2003H-16S芯片

随着智能家居概念的普及&#xff0c;消费者对家电产品的智能化、便捷性提出了更高要求。豆浆机作为厨房常用电器&#xff0c;其操作便捷性和用户体验直接影响市场竞争力。传统豆浆机多依赖指示灯或简单蜂鸣器提示用户操作状态&#xff0c;信息传递单一且无法满足个性化需求。 在…

解密工业控制柜:认识关键硬件(PLC)

前言 作为一名视觉开发工程师&#xff0c;我们不仅要做到做好自己的工作&#xff0c;我们更需要在工业现场学习更多知识&#xff0c;最近网上流传很多&#xff0c;“教会徒弟&#xff0c;饿死师傅”&#xff1b;在自动化行业中&#xff0c;在项目下来很忙的时候&#xff0c;我们…

【嵌入式系统设计师】知识点:第11 章 嵌入式系统设计案例分析

提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…

【深度解析】SkyWalking 10.2.0版本安全优化与性能提升实战指南

前言 Apache SkyWalking 作为云原生可观测性领域的佼佼者&#xff0c;在微服务架构监控中扮演着至关重要的角色。然而&#xff0c;官方版本在安全性、镜像体积和功能扩展方面仍有优化空间。本文将分享一套完整的 SkyWalking 10.2.0 版本优化方案&#xff0c;从安全漏洞修复到镜…

面向大模型的开发框架LangChain

这篇文章会带给你 如何使用 LangChain&#xff1a;一套在大模型能力上封装的工具框架如何用几行代码实现一个复杂的 AI 应用面向大模型的流程开发的过程抽象 文章目录 这篇文章会带给你写在前面LangChain 的核心组件文档&#xff08;以 Python 版为例&#xff09;模型 I/O 封装…

Easysearch VS Opensearch 数据写入与存储性能对比

本文记录 Easysearch 和 Opensearch 数据写入和数据存储方面的性能对比。 准备 压测工具&#xff1a;INFINI Loadgen 对比版本&#xff1a; Easysearch 1.11.1&#xff08;lucene 8.11.4&#xff09;Opensearch 2.19.1&#xff08;lucene 9.12.1&#xff09; 节点 JVM 配置…

【Proteus仿真】【32单片机-A009】矩阵按键系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、按键值与LCD显示 2、矩阵按键 二、使用步骤 系统运行后&#xff0c;LCD1602显示当前的按键值&#xff1b; 当按下不同按键后显示屏更新对应的按键值。 三、硬件资…

用一个实际例子快速理解MCP应用的工作步骤

已经有很多的文章介绍MCP server&#xff0c;MCP Client工作原理&#xff0c;这里不做太多介绍。但是很多介绍都只是侧重介绍概念&#xff0c;实际的工作原理理解起来对初学者还是不太友好。本文以一个智能旅游咨询系统为例&#xff0c;详细说明在利用 Model Context Protocol&…

TCP 和 UDP 可以使用同一个端口吗?

TCP 和 UDP 可以使用同一个端口吗&#xff1f; 前言 在深入探讨 TCP 和 UDP 是否可以使用同一个端口之前&#xff0c;我们首先需要理解网络通信的基本原理。网络通信是一个复杂的过程&#xff0c;涉及到多个层次的协议和机制。在 OSI 模型中&#xff0c;传输层是负责端到端数…

探索原生JS的力量:自定义实现类似于React的useState功能

1.写在前面 本方案特别适合希望在历史遗留的原生JavaScript项目中实现简单轻量级数据驱动机制的开发者。无需引入任何框架或第三方库&#xff0c;即可按照此方法封装出类似于React中useState的功能&#xff0c;轻松为项目添加状态管理能力&#xff0c;既保持了项目的轻量性&am…

HBuilder运行uni-app程序报错【Error: listen EACCES: permission denied 0.0.0.0:5173】

一、错误提示&#xff1a; 当使用HBuilder运行uni-app项目的时候提示了如下错误❌ 15:11:03.089 项目 project 开始编译 15:11:04.404 请注意运行模式下&#xff0c;因日志输出、sourcemap 以及未压缩源码等原因&#xff0c;性能和包体积&#xff0c;均不及发行模式。 15:11:04…

VMware Fusion Pro 13 for Mac虚拟机

VMware Fusion Pro 13 for Mac虚拟机 文章目录 VMware Fusion Pro 13 for Mac虚拟机一、介绍二、效果下载 一、介绍 VMware Fusion Pro for Mac&#xff0c;是一款mac虚拟机软件&#xff0c;跟Parallels Desktop一样&#xff0c;都可以让你的 Mac 同时运行一个或多个不同的操作…