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

JVM(12)——详解G1垃圾回收器

G1(Garbage-First)垃圾回收器。它是现代 Java 应用中默认的垃圾回收器(自 JDK 9 起),旨在提供一个高性能、可预测停顿时间(低延迟)的解决方案,尤其适合大内存(多GB甚至TB级别)和多核处理器的服务器环境。

一、G1 的设计目标与定位

  1. 取代 CMS 和 Parallel Scavenge:

    • CMS(Concurrent Mark-Sweep)虽然低延迟,但存在内存碎片化、无法处理浮动垃圾导致 Full GC 等问题,且对堆大小有限制。

    • Parallel Scavenge(吞吐量优先)追求高吞吐量,但无法提供可预测的停顿时间。

  2. 核心目标:

    • 可预测的停顿时间模型: 允许用户指定期望的最大 GC 停顿时间(-XX:MaxGCPauseMillis,默认 200ms),G1 会尽力满足这个目标。

    • 高吞吐量: 在满足停顿时间目标的前提下,尽可能提高应用吞吐量。

    • 适应大堆: 能够高效地管理从几百MB到几十TB大小的堆内存。

  3. 关键特性:

    • 并发与并行: 利用多核优势,在应用线程运行的同时执行部分 GC 工作(并发),并在需要停顿的阶段使用所有可用 CPU 资源并行处理(并行)。

    • 分代收集: 仍然遵循分代假说(大多数对象朝生夕死),但物理上不再严格划分为连续的年轻代和老年代区域。

    • 空间整合: 使用复制算法进行回收,有效避免 CMS 带来的内存碎片问题。

    • 可扩展性: 设计上能更好地利用现代多核 CPU 和大内存硬件。

二、核心概念:Region 化堆 (Heap Regionization)

这是 G1 区别于之前回收器的最根本设计

  1. 堆划分: G1 将整个 Java 堆划分为多个大小相等(默认约 1MB 到 32MB,具体大小根据堆初始值和最大值的平均值除以约 2048 决定)的独立内存区域,称为 Region

  2. Region 类型: 每个 Region 在任意时刻都被赋予一个特定的角色:

    • Eden Region: 存放新创建的对象(属于年轻代)。

    • Survivor Region: 存放年轻代 GC 后存活的对象(属于年轻代)。

    • Old Region: 存放存活时间较长、经过多次年轻代 GC 后仍然存活的对象(属于老年代)。

    • Humongous Region: 专门用于存储巨型对象(大小超过单个 Region 容量 50% 的对象)。一个巨型对象可能占用一个或多个连续的 Humongous Region。

    • 空闲 Region: 未分配的可用空间。

  3. 动态角色转换: Region 的角色不是固定的。在一次 GC 后,一个 Eden Region 被清空后可以变成 Survivor 或 Old Region,或者被释放为空闲 Region。一个 Survivor Region 在对象晋升后可以变成 Old Region。

  4. 优势:

    • 灵活的堆管理: 不再需要预先固定年轻代和老年代的大小比例,允许根据回收效率和停顿目标动态调整各代占用的 Region 数量。

    • 可预测停顿的基础: GC 的工作可以集中在包含最多垃圾(Garbage-First 名字的由来)的 Region 集合上,而不是扫描整个堆或整个老年代,使得每次回收的时间更可控。

    • 增量回收: 每次 GC 可以只处理一部分 Region。

三、核心数据结构:Remembered Sets (RSet) 和 Collection Sets (CSet)

  1. Remembered Set (RSet):

    • 目的: 解决跨 Region 引用问题。一个 Region 中的对象可能被其他 Region 中的对象引用(跨代引用或同代不同 Region 引用)。为了避免在回收一个 Region 时扫描整个堆来确定对象是否存活,G1 为每个 Region 维护一个 RSet。

    • 原理: RSet 本质上是一个指向该 Region 的“外来指针”的集合(更准确地说,是记录哪些其他 Region 包含指向本 Region 的引用)。它是一个Points-Into 结构。

    • 实现: 通常使用哈希表或卡表(Card Table)的变体实现,粒度比传统卡表更细(可能是卡页的一部分)。

    • 维护: 写屏障(Write Barrier)负责检测应用线程对对象引用的写操作(如 obj.field = otherObj)。如果这个写操作导致了一个跨 Region 的引用(例如,obj 在 Region A,otherObj 在 Region B),那么写屏障会将被修改的引用所在的卡页(或更细粒度)标记为“脏”,并将相关信息记录到otherObj所在 Region B 的 RSet 中(表示 Region A 有对象指向 Region B)。

    • 重要性: RSet 是 G1 实现部分收集(Partial GC) 的关键。当回收某个 Region 时,只需扫描该 Region 内部的对象和其 RSet 中记录的引用来源 Region,即可确定该 Region 中对象的存活状态,避免扫描整个堆,大大减少了 GC 的工作量。

  2. Collection Set (CSet):

    • 目的: 定义在一次 GC 周期(通常是 Young GC 或 Mixed GC)中哪些 Region 将被回收

    • 选择策略:

      • 年轻代回收: CSet 包含所有 Eden Region 和 Survivor Region(即整个年轻代)。

      • 混合回收: CSet 包含所有年轻代 Region(Eden + Survivor)加上根据预测模型和停顿时间目标精心挑选出的一部分垃圾比例高(Garbage-First)的老年代 Region

    • 决策依据: G1 根据 Region 的垃圾比例(可回收空间)、回收所需时间(复制存活对象的成本)以及用户设置的 MaxGCPauseMillis 目标,动态计算并选择一组 Region 加入 CSet,使得回收这组 Region 的预期时间接近但不超出目标停顿时间。

    • 意义: CSet 是实现可预测停顿的核心机制。通过控制每次回收处理的 Region 集合的大小(垃圾量),G1 能够控制每次 GC 停顿的时长。

四、G1 的 GC 周期 (Garbage Collection Cycle)

G1 的 GC 活动不再严格区分 Minor GC 和 Major GC,而是组织成一个持续的、由不同阶段组成的周期:

  1. 年轻代回收 (Young-only Phase):

    • 触发条件: 当 Eden Region 被填满时触发。

    • 过程:

      • Stop-The-World (STW): 暂停所有应用线程。

      • 根扫描: 从 GC Roots(栈、寄存器、全局变量、JNI 引用等)开始扫描。

      • 更新/处理 RSet: 处理在并发标记阶段记录的引用变化(SATB 缓冲区)。

      • 对象拷贝: 并行地将 CSet(所有 Eden + Survivor Region)中的存活对象复制到新的 Survivor Region 或(如果对象年龄达到阈值 -XX:MaxTenuringThreshold)直接晋升到 Old Region。复制过程使用复制算法

      • 清空 CSet: 回收的 Region 被清空并放回空闲 Region 列表。

      • 调整 Survivor 数量: 根据停顿目标动态调整下次 Young GC 使用的 Survivor Region 数量。

    • 特点: 只回收年轻代 Region。频繁发生,但通常停顿时间较短。

  2. 并发标记周期 (Concurrent Marking Cycle):

    • 触发条件: 当整个堆的使用率超过一个阈值(-XX:InitiatingHeapOccupancyPercent, IHOP, 默认 45%)时启动。这个周期为后续的混合回收识别出老年代中垃圾比例高的 Region。

    • 阶段 (部分并发,部分 STW):

      • 初始标记 (Initial Mark - STW): 短暂停顿,标记所有从 GC Roots 直接可达的对象。通常借道一次 Young GC 完成(因为 Young GC 本身就需要扫描根)。

      • 根区域扫描 (Root Region Scanning - Concurrent): 扫描 Survivor Region(作为根区域,因为它们可能引用老年代对象),完成后才能开始下一次 Young GC。

      • 并发标记 (Concurrent Marking - Concurrent): 与应用线程并发执行,遍历对象图,标记所有可达(存活)对象。使用 SATB (Snapshot-At-The-Beginning) 算法保证标记一致性:在标记开始时对对象图做逻辑快照,标记过程中新分配的对象视为存活,并发期间删除的引用通过写屏障记录在 SATB 缓冲区,在后续阶段处理。

      • 最终标记 (Remark - STW): 短暂停顿,处理 SATB 缓冲区,完成标记过程。进行全局引用处理(如类卸载准备)和弱引用处理。

      • 清理 (Cleanup - STW & Concurrent):

        • STW 部分: 统计每个 Region 中存活对象的数量,排序 Region(根据可回收空间),识别完全空闲的 Region 并回收。为混合回收选择初始的候选老年代 Region集合

        • Concurrent 部分: 执行实际的内存回收(如重置空 Region)和 RSet 清理。

    • 产出: 得到一份老年代 Region 的垃圾比例排序列表,供混合回收使用。

  3. 混合回收 (Mixed Collection Phase):

    • 触发条件: 在并发标记周期完成后立即开始(如果老年代中有足够多的可回收 Region)。

    • 过程: 类似于 Young GC,但是 CSet 不仅包含所有年轻代 Region(Eden + Survivor),还包含一部分(根据停顿目标选择)在并发标记周期中识别出的垃圾比例高的老年代 Region

    • 特点:

      • 在一次 STW 停顿中,同时回收年轻代和部分老年代。

      • 可能会有多次连续的 Mixed GC,直到回收了足够多的老年代空间(达到 IHOP 阈值以下,或没有足够高垃圾比例的老年代 Region 了)。

      • 这是 G1 回收老年代的主要方式,避免了 Full GC。

  4. Full GC (Serial Full GC - 备选):

    • 触发条件 (应尽量避免):

      • 晋升失败(年轻代 GC 时 Survivor 和 Old 空间都不足)。

      • 混合回收速度跟不上应用分配新对象的速度(并发标记周期完成前堆就满了)。

      • 大对象分配找不到足够的连续 Humongous Region。

      • 元空间(Metaspace)不足。

    • 过程: G1 会退化使用 Serial Old GC 算法(单线程的 Mark-Sweep-Compact),对整个堆进行标记-清除-压缩。停顿时间非常长!

    • 目标: 通过调整参数(堆大小、IHOP、GC线程数等)和优化应用(减少内存分配、减少大对象、避免过早晋升)来完全避免 Full GC。

五、G1 的优势

  1. 可预测的低延迟: 通过 MaxGCPauseMillis 控制目标停顿时间,适合需要响应时间的应用(如 Web 服务、交易系统)。

  2. 高吞吐量: 在满足停顿时间目标的前提下,利用多核并行处理,保持较高的应用吞吐量。

  3. 大堆高效管理: Region 化设计和部分收集机制使其能有效管理超大堆内存。

  4. 空间整合: 基于复制的回收算法避免了内存碎片问题。

  5. 设计先进: 并发标记、SATB、精细的 RSet 等机制充分利用现代硬件。

六、G1 的劣势与调优考虑

  1. 内存占用 (Footprint):

    • RSet 需要额外内存开销(通常堆的 5%-20%)。

    • 写屏障(维护 RSet 和 SATB)会带来一定的运行时开销(CPU)。

  2. 更复杂的调优:

    • -XX:MaxGCPauseMillis:设置合理的目标(太激进会导致频繁 GC 降低吞吐量,太宽松则失去意义)。不要期望设置为 10ms 就能达到,需要根据硬件和应用实际情况调整。

    • -XX:InitiatingHeapOccupancyPercent:触发并发标记周期的堆占用阈值。如果 Mixed GC 回收速度跟不上对象晋升速度导致过早 Full GC,可能需要降低 IHOP。如果并发标记启动过早(老年代垃圾不多),可以适当提高。

    • -XX:ConcGCThreads / -XX:ParallelGCThreads:控制并发和并行阶段的线程数。

    • -XX:G1NewSizePercent / -XX:G1MaxNewSizePercent:虽然动态调整,但仍可设置年轻代大小的上下限。

    • -XX:G1HeapRegionSize:显式设置 Region 大小(通常是 2 的幂,1MB~32MB)。巨型对象大小会影响 Region Size 的选择。

  3. 巨型对象 (Humongous Objects):

    • 分配和回收可能更复杂(需要连续 Region)。

    • 频繁分配/释放大对象可能导致堆碎片(虽然 G1 能避免传统碎片,但对 Humongous 连续空间需求可能造成问题)或过早 Full GC。尽量优化应用避免过多大对象。

七、何时使用 G1?

  • 应用需要较低的、可预测的停顿时间(如延迟敏感型服务)。

  • 运行在大内存(>=6GB) 的服务器上。

  • Full GC 不可接受 或需要避免(通过 G1 的 Mixed GC 机制)。

  • 应用有中等或较高的吞吐量要求(在满足延迟前提下)。

  • JDK 8 update 40 或更高版本(生产环境建议用较新稳定版 JDK 11/17/21)。

八、总结

G1 垃圾回收器是 JVM 垃圾回收技术的一个重要里程碑。它通过 Region 化堆、Remembered Set、Collection Set 和并发标记等创新设计,在提供可预测低停顿时间的同时,兼顾了高吞吐量,并有效解决了大堆管理和内存碎片问题。虽然调优相对复杂且有一定内存开销,但它已成为现代 Java 应用(特别是服务端应用)默认且推荐的垃圾回收器。

相关文章:

JVM(12)——详解G1垃圾回收器

G1(Garbage-First)垃圾回收器。它是现代 Java 应用中默认的垃圾回收器(自 JDK 9 起),旨在提供一个高性能、可预测停顿时间(低延迟)的解决方案,尤其适合大内存(多GB甚至TB…...

Matplotlib vs Seaborn:选择与区别

相同点 都是Python数据可视化库:两者都用于创建统计图形和图表 基于Python生态系统:都与NumPy、Pandas等科学计算库良好集成 开源免费:两者都是开源项目,可自由使用 支持多种图表类型:都能创建折线图、柱状图、散点…...

TCP/UDP协议深度解析(一):UDP特性与TCP确认应答以及重传机制

🔍 开发者资源导航 🔍🏷️ 博客主页: 个人主页📚 专栏订阅: JavaEE全栈专栏 前言 在网络通信的世界里,传输层协议如同交通规则,决定了数据包如何从源头抵达目的地。其中UDP和TCP就…...

Linux线程概念及常用接口(1)

目录 1. Linux线程概念 什么是线程 线程的优点 线程的缺点 线程异常 线程用途 2. Linux进程VS线程 进程和线程 关于进程线程的问题 3. Linux线程控制 POSIX线程库 创建线程 线程ID及进程地址空间布局 线程终止 线程等待 为什么需要线程等待? 4. 分离线程 1. Linux线…...

Qt+OPC开发笔记(三):OPC客户端订阅特点消息的Demo

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/148868209 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...

《美化生活》投稿简介

《美化生活》杂志是国家新闻出版署批准的正规期刊,是面向全国发行的文学艺术刊。本刊坚持“传播新理念,交流新经验”办刊方针,坚持“指导消费、丰富生活、美化心灵、雅俗共赏”的宗旨,以其丰富的内容,融学术性与技术性…...

如何为虚拟机上的 Manjaro Linux启用 VMware 拖放功能

如果你的Manjaro 发行版本是安装在 VMware Workstation Player 上使用的 ,而且希望可以通过拖放功能将文件或文件夹从宿主机复制到客户端的Manjaro 里面,那么可以按照以下的步骤进行操作,开启拖放功能。 在 VMware 虚拟机上安装 Manjaro 后&…...

VIVADO导出仿真数据到MATLAB中进行分析

VIVADO导出仿真数据到MATLAB中进行分析 目录 前言 一、导出仿真数据需要编写的RTL代码 二、MATLAB读入txt文件中的数据 三、需要注意的点 总结 前言 在使用 Xilinx Vivado 进行 FPGA 开发时,如何将 RTL 仿真生成的数据导出,进行进一步分析与可视化&…...

Harmony状态管理@Event

ArkUI Event装饰器:实现子组件向父组件通信的规范方式 概述 Event装饰器是ArkUI框架中用于规范组件间通信的重要工具,特别是在需要子组件向父组件请求更新Param变量的场景下。它通过回调机制实现数据的双向同步,是组件化开发中不可或缺的一…...

算力服务器选型

算力服务器选型需结合应用场景、算力需求及扩展性,核心要素如下: 应用定位: AI 训练 / 推理:优先高算力 GPU(如 NVIDIA A100、H100,或 RTX4090),搭配多核 CPU(如 Intel …...

基于目标驱动的分布式敏捷开发

研究结论 风险对项目目标的影响 时间目标:需求管理不当(如需求优先级不明确、多产品负责人需求冲突)、架构变更导致的返工、跨站点协调问题(如第三方依赖、通信基础设施不足)是影响项目时间的主要风险因素。质量目标&…...

大数据在UI前端的应用拓展:用户行为分析的深度挖掘

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在当今数字化时代,大数据已成为推动各行业发展的核心动力之一。对于 UI 前端而言&…...

elk+filebeat收集springboot项目日志

目录 步骤 1: 安装和配置Elasticsearch 步骤 2: 安装和配置Logstash(可选) 步骤 3: 安装和配置Filebeat 步骤 4: 安装和配置Kibana 要使用ELK(Elasticsearch, Logstash, Kibana)堆栈和Filebeat来收集Spring Boot项目的日志&am…...

华为云Flexus+DeepSeek征文 | 华为云MaaS平台上的智能客服Agent开发:多渠道融合应用案例

华为云FlexusDeepSeek征文 | 华为云MaaS平台上的智能客服Agent开发:多渠道融合应用案例 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不…...

SQL关键字三分钟入门:UPDATE —— 修改数据

在数据库操作中,除了添加新记录外,我们还需要经常修改已有的记录。例如: 更新用户的个人信息;调整订单的状态;更改产品的价格。 这时候就需要用到 SQL 中非常基础但极其重要的关键字 —— UPDATE! 它是用…...

用Rust写平衡三进制加法器

1、三进制加法器的发展 最初的平衡三进制加法是采用了三选一结构(github原文),这位大佬也很厉害,他是硬件都弄了出来的,也写了虚拟机,甚至用这三态多路复用器弄出了可以存状态的硬件,但我没有去看了,因为当…...

【AI时代速通QT】第三节:Linux环境中安装QT并做测试调试

目录 引言 一、Linux QT开发环境的核心要素 1.1 编译器(g)与构建工具(make) 1.2 搞定 OpenGL 依赖 二、核心步骤——安装 Qt Creator 2.1 获取官方在线安装器 2.2 赋予文件执行权限 2.3 运行图形化安装向导 三、Linux上创…...

论文阅读:2025 arxiv Qwen3 Technical Report

https://arxiv.org/pdf/2505.09388 https://www.doubao.com/chat/9918384373236738 文章目录 论文翻译Qwen3技术报告摘要1 引言 论文翻译 Qwen3技术报告 Qwen团队 摘要 在这项工作中,我们介绍了Qwen模型家族的最新版本Qwen3。Qwen3包含一系列大型语言模型&…...

Vue3+el-table-v2虚拟表格大数据量多选功能详细教程

Vue3el-table-v2虚拟表格大数据量多选功能详细教程 本教程基于 Element Plus 组件库的 el-table-v2(假设你使用虚拟滚动表格),实现大数据量场景下的多选功能,并包含了全选、反选、已选行展示、清除选择等完整交互。 一、项目背景与…...

开源跨平台的轻量 C# 编辑器

NetPad一个基于.NET 开源、跨平台的 C# 编辑器,目的是创建一个开源的、支持 Web 的跨平台替代方案,从而为开发者提供便利的编程环境并为非 Windows 环境下的开发者提供一个可替代 LINQPad 的实用工具。它以.NET SDK 作为基础运行时环境,利用E…...

QT多线程

使用多线程的好处 假如当前窗口要进行一段非常复杂的逻辑处理,在单线程的情况下,是无法操控界面UI的,点击界面UI没有响应。此时就要用到多线程。 注意: 1、默认的线程在Qt中称之为窗口线程,也叫主线程,负…...

了解公共部门中的数据网格:支柱、架构和示例

作者:来自 Elastic Elastic Platform Team 想想那些像公共健康记录、城市规划模型等项目背后的所有数据。政府机构一直在产生大量数据。当数据分散在云平台、本地系统或像卫星和应急响应中心这样的专业环境中时,情况变得更加复杂。找到信息变得困难&…...

关于一维数组和字符串的详细讲解(从属于GESP三级)

本章内容 一维数组基础 字符串基础 就像打磨一串符号,每个位置都要精准对待,才能串起完整的风景。坚持下去,小细节终将成就大格局。 一、⼀维数组基础 1 📚 定义 典型写法 说明 易错/拓展 int a[5]; 编译期长度常量&#x…...

【驱动设计的硬件基础】PCI和PCI-E

打开电脑主机,你会看到主板上一排长短不一的插糟:矮胖的 PCI 插糟还插着古老的声卡,旁边细长的 PCI-E 插糟则牢牢卡住显卡、高速网卡等核心设备。这些看似普通的插糟,其实是计算机硬件沟通的 "高速公路",承载…...

【学习记录】Git Base使用-免密连接代码仓库

github(JL765)和gitee(JL765/git-test01)都可以用于管理代码 在windows中,可以通过Git Base软件(Git - Downloading Package)和仓库进行连接 下载略过 github登录 ssh -T gitgithub.com # 成…...

android脱糖

前言 另外一篇相关文章:https://androidblog.blog.csdn.net/article/details/148574130 通过sourceCompatibility 和targetCompatibility可以实现低版本写代码高版本输出(详情可查看我的另一篇文件中的:验证各种Java版本 > 一、纯Java项…...

DVWA Brute Force漏洞深度分析与利用指南

DVWA简介 DVWA(Damn Vulnerable Web Application)是一个基于PHP/MySQL的脆弱性Web应用平台,专为安全专业人员设计,用于测试技能和工具。它包含十大安全模块,其中Brute Force(暴力破解)是最基础…...

Docker 报错“x509: certificate signed by unknown authority”的排查与解决实录

目录 🔧Docker 报错“x509: certificate signed by unknown authority”的排查与解决实录 📌 问题背景 🧪 排查过程 步骤 1:确认加速器地址是否可访问 步骤 2:检查 Docker 是否真的使用了镜像加速器 步骤 3&…...

采用ArcGIS10.8.2 进行插值图绘制

一、最终成果图展示 二、软件下载 链接: 百度网盘 请输入提取码 密码:azay 三、软件安装 1、在安装之前需要关闭电脑的防火墙及杀毒软件 设置-隐私和安全性-Windows安全中心-防火墙和网络保护 2、软件解压 (1)【ArcGIS_Desktop_1082_180......】“以管理员身份运行”…...

国产安路FPGA纯verilog视频图像去雾,基于暗通道先验算法实现,提供5套TD工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目国产安路FPGA相关方案推荐本博主已有的图像处理方案 3、设计思路框架工程设计原理框图输入Sensor之-->GC0308摄像头输入Sensor之-->OV7725摄像头输入Sensor之--…...

利用大型语言模型增强边缘云 AI 系统安全性

大家读完觉得有帮助及的关注和点赞!!! 抽象 随着边缘计算和云系统在 AI 驱动应用中的广泛应用,如何在确保数据隐私的同时保持高效性能已成为一个紧迫的安全问题。本文提出了一种基于联邦学习的数据协作方法,以提高边缘…...

微信小程序中 rpx与px的区别

在微信小程序中的rpx比px方便的多 <!--pages/welcome/welcome.wxml--> <!--rpx替换px--> <image style"width:200rpx;height: 200rpx"src"/images/avatar/3.png"></image> <text>你好&#xff0c;冻梨</text> <but…...

解锁阿里云AnalyticDB:数据仓库的革新利器

AnalyticDB&#xff1a;云数据仓库新势力 在数字化浪潮中&#xff0c;数据已成为企业的核心资产&#xff0c;而云数据仓库作为数据管理与分析的关键基础设施&#xff0c;正扮演着愈发重要的角色。阿里云 AnalyticDB 作为云数据仓库领域的佼佼者&#xff0c;以其卓越的性能、创…...

告别水印烦恼,一键解锁高清无痕图片与视频!

在这个数字化飞速发展的时代&#xff0c;无论是设计小白还是创意达人&#xff0c;都可能遇到这样的困扰&#xff1a;心仪的图片或视频因水印而大打折扣&#xff0c;创意灵感因水印而受限。别急&#xff0c;今天就为大家带来几款神器&#xff0c;让你轻松告别水印烦恼&#xff0…...

前端面试记录

前言&#xff1a;面试题永远是刷不完的&#xff0c;即使刷了一大堆下次面试又忘记了&#xff0c;重要的是组织自己的语言&#xff0c;保持自信&#xff0c;不给自己制造面不过的心理负担&#xff0c;对刷过的题要有个大致印象&#xff0c;好在答题的时候能够多多少少说出点贴近…...

RAG实战基础篇/windows电脑快速部署qwen3:14B

现阶段&#xff0c;在本地部署ollama非常简单&#xff0c;准备好一个有GPU的电脑&#xff0c;十分钟轻松部署qwen3:14b。实现本地的大模型部署。 我这里为了方便起见&#xff0c;直接使用windows电脑下载一个ollama。 访问ollama GIthub地址&#xff1a;ollama开源地址 直接…...

Java SE - 图书管理系统模拟实现

目录 1.设计框架2. 实现用户类3.实现书和书架类4.登录界面的实现5.实现menu方法6.测试菜单选择7.实现一个IFun接口7.1 查找功能的实现7.2 展示功能的实现7.3 增加功能的实现7.4 删除功能的实现7.5 退出功能的实现7.6 借阅功能的实现7.7 归还功能的实现 8.实现IFuntion类型的数组…...

华为HN8145V光猫改华为蓝色公版界面,三网通用,xgpon公版光猫

咸鱼只卖20多元一个&#xff0c;还是xgpon的万兆猫&#xff0c;性价比不错哦 除了没有2.5G网口&#xff0c;其他还行。 改成公版光猫后&#xff0c;运营商是无法纳管光猫&#xff0c;无法后台修改光猫数据及超密。 华为 HN8145V 光猫具有以下特点&#xff1a; 性能方面 高速接…...

【ARM 嵌入式 编译系列 7.5 -- GCC 打印链接脚本各段使用信息】

文章目录 Overview1 在 linker script 中定义符号2 编译并生成 ELF 文件3 使用 nm awk 输出各段地址及大小&#xff08;含单位&#xff09;4 实际输出示例5 进阶建议 Overview 在 GCC 编译生成 elf 后 打印出出数据段的开始地址及结束地址&#xff0c;bss 段的开始地址和结束…...

在大数据求职面试中如何回答分布式协调与数据挖掘问题

在大数据求职面试中如何回答分布式协调与数据挖掘问题 场景&#xff1a;小白的大数据求职面试 小白是一名初出茅庐的程序员&#xff0c;今天他来到一家知名互联网公司的面试现场&#xff0c;面试官是经验丰富的老黑。以下是他们之间的对话&#xff1a; 第一轮提问&#xff1…...

小白成长之路--nginx基础配置(一)

文章目录 一、概述1.1 Nginx 特点1.2 Nginx 作用1.3Nginx工作原理 二、Nginx服务搭建2.1安装2.2 目录结构2.3 配置文件作用2.4 nginx,conf配置文件详解2.5 核心命令2.6 Nginx信号三.Nginx3.1启动 总结 一、概述 Nginx 是开源、高性能、高可靠的 Web服务器 和反向代理服务器&am…...

基于 SpringBoot+JSP 的医疗预约与诊断系统设计与实现

摘要 本研究针对传统医疗预约与诊断流程中存在的效率低下、信息不透明、患者等待时间长等问题&#xff0c;设计并实现了一个基于 SpringBootJSP 的医疗预约与诊断系统。系统采用 B/S 架构&#xff0c;整合了用户管理、科室管理、医生排班、预约挂号、在线问诊、检查检验、诊断…...

C++语言发展历程-2025

C语言发展历程-2025 前言 C是一种高级编程语言&#xff0c;由Bjarne Stroustrup于1979年在贝尔实验室创建&#xff0c;是C语言的扩展和改进版。 C从最初的C with class&#xff0c;经历了C98、C03、C11、C 14、C17、C20、C23多次标准化改造&#xff0c;成为一门多范式、高性…...

Zynq + FreeRTOS + YAFFS2 + SQLite3 集成指南

Zynq FreeRTOS YAFFS2 SQLite3 集成指南 一、系统架构设计 #mermaid-svg-qvuP6slyza89wsiT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qvuP6slyza89wsiT .error-icon{fill:#552222;}#mermaid-svg-qvuP6slyz…...

Python基础之函数

代码仓库地址&#xff1a;gitgithub.com:Liucc-123/python_learn.git 函数介绍 函数是组织好的、可重复使用的&#xff0c;用来实现单一、或相关功能的代码段。 函数可以提高应用的模块性和代码的可重复性。python 有许多内置的函数比如 print 打印函数&#xff0c;python 也…...

Python异步爬虫编程技巧:从入门到高级实战指南

Python异步爬虫编程技巧&#xff1a;从入门到高级实战指南 &#x1f680; &#x1f4da; 目录 前言&#xff1a;为什么要学异步爬虫异步编程基础概念异步爬虫核心技术栈入门实战&#xff1a;第一个异步爬虫进阶技巧&#xff1a;并发控制与资源管理高级实战&#xff1a;分布式…...

Redis哨兵模式深度解析与实战部署

Redis哨兵模式深度解析与实战部署 文章目录 Redis哨兵模式深度解析与实战部署一、Redis哨兵模式理论架构详解1.1 哨兵模式的核心架构组成基础架构拓扑图 1.2 哨兵节点的核心功能模块1.2.1 监控模块&#xff08;Monitoring&#xff09;1.2.2 决策模块&#xff08;Decision Makin…...

【软考高级系统架构论文】论边缘计算及其应用

论文真题 边缘计算是在靠近物或数据源头的网络边缘侧,融合网络、计算、存储、应用核心能力的分布式开放平台(架构),就近提供边缘智能服务。边缘计算与云计算各有所长,云计算擅长全局性、非实时、长周期的大数据处理与分析,能够在长周期维护、业务决策支撑等领域发挥优势;…...

触摸屏(典型 I2C + Input 子系统设备)从设备树解析到触摸事件上报

触摸屏&#xff08;典型 I2C Input 子系统设备&#xff09;从设备树解析到触摸事件上报 以下是架构图&#xff0c;对触摸屏&#xff08;典型I2C Input子系统设备&#xff09;从设备树解析到触摸事件上报的全流程详细拆解&#xff0c;包含文字讲解和配套流程图&#xff1a; 注…...

Java中==与equals()方法的深度解析

作为Java后端开发者&#xff0c;我们经常会遇到需要比较两个对象是否相等的情况。在Java中&#xff0c;运算符和equals()方法都可以用于比较&#xff0c;但它们之间存在着本质的区别。 1. 运算符 是一个比较运算符&#xff0c;它的行为取决于比较的类型&#xff1a; 1.1 比较…...