JVM(8)——详解分代收集算法
JVM 的分代收集算法不是一种具体的垃圾收集算法实现,而是一种指导思想和设计原则,是现代 JVM 垃圾收集器的基石。其核心思想源于对程序运行过程中对象生命周期分布的观察(即弱分代假说)。
核心思想与理论基础:分代假说
JVM 的分代收集算法建立在两个关键的经验性观察(假说)之上:
-
弱分代假说:
-
核心内容: 绝大多数对象都是“朝生夕死”的。它们在分配出来后很快就变得不可达,成为垃圾。
-
证据: 大量的性能分析表明,在大多数应用程序中,超过 98% 的对象在第一次垃圾收集(Minor GC)时就被回收了。
-
推论: 应该将精力集中在回收那些新创建的、很可能很快消亡的对象上。
-
-
强分代假说:
-
核心内容: 熬过越多次垃圾收集过程的对象(存活时间越长),就越难以消亡(在未来也越不容易变成垃圾)。
-
证据: 一些对象(如缓存、静态变量引用的对象、Spring Bean 容器中的单例等)会贯穿应用程序的整个生命周期。
-
推论: 不应该频繁地去扫描那些“老顽固”对象,避免做无用功。
-
-
跨代引用假说(隐含):
-
核心内容: 跨代引用(老年代对象引用新生代对象)相对于同代引用来说非常少。
-
重要性: 这个假说非常关键,它保证了我们可以相对独立地收集新生代,而不必每次都扫描整个老年代来确认新生代对象的可达性。如果跨代引用非常普遍,分代收集的优势就会大打折扣。
-
解决方案: JVM 使用 记忆集 和 卡表 来高效地处理少量的跨代引用。
-
分代收集的核心目标: 基于以上假说,将堆内存划分为不同的“代”,并针对不同代中对象的特性(存活率、生命周期)采用最适合、最高效的垃圾收集算法,从而最大化垃圾回收的效率和性能,最小化停顿时间(STW)。
JVM 堆内存的分代划分
现代 JVM(HotSpot 为主)通常将堆划分为两个物理上或逻辑上的主要代:
-
新生代:
-
对象特点: 新创建的对象绝大部分都在这里分配。对象生命周期极短,死亡率非常高(98%以上)。
-
设计目标: 快速回收大量垃圾对象,追求高回收效率和短停顿时间。
-
内部结构(进一步优化): 为了更高效地管理,新生代通常又被划分为三个区域:
-
Eden 区: 新对象诞生的地方。当 Eden 区满时,触发 Minor GC。
-
Survivor 区 (From): 存放上一次 Minor GC 后存活下来的年轻对象。通常有两个 Survivor 区(S0 和 S1)。
-
Survivor 区 (To): 在 Minor GC 期间,作为存活对象复制的目的地。S0 和 S1 的角色(From/To)在每次 Minor GC 后会互换。
-
-
默认比例:
-XX:NewRatio
可以设置老年代/新生代的比例(默认值 2,表示老年代是新生代的 2 倍)。新生代内部-XX:SurvivorRatio
设置 Eden 区与一个 Survivor 区的比例(默认 8,表示 Eden:S0:S1 = 8:1:1)。 -
GC 类型: Minor GC 或 Young GC。只收集新生代(Eden + From Survivor)。
-
回收算法: 复制算法(或其高度优化的 Appel 式变种)。原因:
-
新生代对象死亡率极高,存活对象少,复制开销小。
-
复制算法效率高(只处理存活对象)、STW 时间短。
-
复制算法天然能解决内存碎片问题,使得新生代对象分配(指针碰撞)非常快。
-
-
-
老年代:
-
对象特点: 存放生命周期较长的对象。
-
在新生代中经历多次 Minor GC(默认 15 次,通过
-XX:MaxTenuringThreshold
设置)仍然存活的对象,会被晋升到老年代。 -
大对象(
-XX:PretenureSizeThreshold
设置阈值)可能直接在老年代分配,避免在新生代中反复复制。
-
-
设计目标: 存放“老年”对象,这些对象存活率高,回收频率相对较低。更关注空间利用率和避免内存碎片。
-
GC 类型:
-
Major GC: 通常指只清理老年代的 GC(但定义有时不统一)。
-
Full GC: 清理整个堆,包括新生代、老年代,通常还会包括方法区(元空间)。触发条件更严格(老年代空间不足、方法区空间不足、显式调用
System.gc()
等),停顿时间通常很长。
-
-
回收算法: 标记-清除 或 标记-整理 算法或其变种/组合。
-
标记-清除: CMS 收集器的老年代回收主要阶段使用并发标记清除。优点是并发执行,停顿时间短;缺点是产生内存碎片。
-
标记-整理: Serial Old, Parallel Old, G1, ZGC, Shenandoah 的老年代/整堆回收本质上都是标记-整理(或基于移动/复制的整理)。优点是解决碎片问题,空间利用率高,分配快;缺点是 STW 时间可能较长(现代收集器通过并发技术极大优化了这点)。
-
-
-
方法区:
-
特点: 存放已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等。回收目标主要是废弃的常量和不再使用的类型(类卸载)。
-
回收条件苛刻: 需要满足类加载器被回收、类的所有实例被回收、该类的 Class 对象没有被引用等条件。回收效率低,通常不频繁。
-
GC 类型: 一般发生在 Full GC 中。
-
分代收集算法的工作流程(以 Minor GC 和对象晋升为例)
-
对象分配:
-
绝大多数新对象在 Eden 区分配。
-
如果对象非常大(超过
-XX:PretenureSizeThreshold
),可能直接在老年代分配(避免在新生代中大量复制)。
-
-
触发 Minor GC:
-
当 Eden 区空间不足时,JVM 触发一次 Minor GC。
-
-
Minor GC 过程:
-
暂停应用线程 (STW): 开始垃圾回收。
-
可达性分析: 从 GC Roots 出发,扫描 Eden 区和当前的 From Survivor区,标记所有可达对象为存活。
-
处理跨代引用: 通过卡表快速找到老年代中可能存在指向新生代对象的引用(脏卡),将其加入 GC Roots 进行扫描。
-
-
复制存活对象:
-
将 Eden 区和 From Survivor 区中所有存活的对象,复制到当前的 To Survivor区。
-
在复制过程中:
-
对象的年龄增加 1。
-
对象被紧密排列在 To Survivor 区的起始位置。
-
-
如果 To Survivor 区空间不足以容纳所有存活对象,或者某个对象的年龄达到了
-XX:MaxTenuringThreshold
,则该对象会被直接晋升到老年代。 -
如果存活对象非常大,或者老年代空间也不足,可能会触发更复杂的处理(如提前晋升、担保失败导致 Full GC)。
-
-
清理与交换:
-
完全清空 Eden 区和当前的 From Survivor区。
-
交换 From Survivor 和 To Survivor 的角色。原来的 To Survivor 区(现在存放着存活对象)成为新的 From Survivor 区。原来的 From Survivor 区(已被清空)成为新的 To Survivor 区。
-
-
恢复应用线程: Minor GC 结束,应用线程恢复运行。
-
新对象分配: 新对象继续在 Eden 区和新的 From Survivor 区分配。
-
-
触发 Full GC:
-
当老年代空间不足、方法区空间不足、或者某些特定条件(如
System.gc()
)被触发时,JVM 会进行 Full GC。 -
Full GC 会对整个堆(新生代、老年代)以及方法区进行垃圾回收,通常使用标记-清除-整理或标记-整理算法(取决于使用的收集器)。Full GC 的 STW 时间通常显著长于 Minor GC。
-
分代收集算法的优势
-
高效性:
-
针对新生代: 利用其高死亡率特性,使用高效的复制算法,只处理少量存活对象,回收速度快,STW 时间极短。
-
针对老年代: 减少扫描频率(存活率高),使用更注重空间管理的算法(标记-清除/整理),避免在长生命周期对象上浪费过多时间。
-
-
低延迟(Minor GC): 新生代的快速回收保证了应用程序大部分时间能快速响应。
-
高吞吐量: 通过减少不必要的扫描(老年代)和高效的回收(新生代),整体上提高了应用的吞吐量。
-
空间优化: 根据不同代的特点选择算法,如复制算法解决了新生代碎片问题,标记-整理解决了老年代碎片问题。
-
灵活性: 允许为不同的代选择不同的垃圾收集器组合(如 ParNew + CMS, Parallel Scavenge + Parallel Old, G1, ZGC 等),以适配不同的应用场景(吞吐量优先 or 低延迟优先)。
分代收集算法的挑战与解决方案
-
跨代引用问题:
-
挑战: 老年代对象可能引用新生代对象。在只收集新生代(Minor GC)时,如果仅扫描新生代的 GC Roots,可能会遗漏这些被老年代引用的新生代对象(它们应该是存活的),导致错误回收。
-
解决方案:记忆集与卡表
-
记忆集: 一种抽象数据结构,用于记录从非收集区域(老年代)指向收集区域(新生代)的所有引用。
-
卡表: 记忆集的一种具体、高效的实现方式。
-
将老年代内存划分为固定大小的块(如 512 字节),称为 卡页。
-
用一个字节数组(卡表)来标记这些卡页。如果某个卡页内的对象存在指向新生代对象的引用,则标记该卡页为 脏卡。
-
在 Minor GC 时,除了扫描新生代自身的 GC Roots,还需要扫描卡表中标记为脏的卡页(即老年代中可能存在指向新生代引用的区域),将这些引用加入到 Minor GC 的 GC Roots 中。这大大减少了需要扫描的老年代区域。
-
-
-
-
对象晋升策略:
-
挑战: 如何决定何时将对象从新生代移动到老年代?过早晋升浪费老年代空间(存放了本可以快速消亡的对象),过晚晋升可能导致 Survivor 区溢出或增加复制开销。
-
解决方案:
-
年龄阈值:
-XX:MaxTenuringThreshold
设置对象在新生代经历多少次 GC 后晋升(默认 15)。 -
动态年龄判定: 如果 Survivor 空间中相同年龄的所有对象大小的总和大于 Survivor 空间的一半,则年龄大于或等于该年龄的对象就可以直接进入老年代。无需等到
MaxTenuringThreshold
。 -
空间担保: 在 Minor GC 之前,JVM 会检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小。如果大于,则尝试 Minor GC(有风险);如果小于,或者设置
-XX:HandlePromotionFailure
为允许担保失败(老版本),则检查是否允许担保失败。如果不允许或判断失败风险大,则改为进行一次 Full GC。这是一种避免 Minor GC 后老年代空间不足导致 OOM 的预防机制。
-
-
现代收集器与分代
虽然分代思想是主流,但现代超低延迟收集器在实现上有所演变:
-
G1: 物理上不再严格划分连续的新生代和老年代区域,而是将堆划分为多个大小相等的 Region。每个 Region 可以动态地扮演 Eden、Survivor 或 Old 角色。但在逻辑上仍然遵循分代假说,收集时会优先收集那些包含最多垃圾的 Region(通常是 Eden 和 Survivor Region),并管理对象的年龄和晋升。它结合了分代和分区收集的思想。
-
ZGC / Shenandoah: 物理上也不分代(或可选分代),它们通过着色指针、读屏障等先进技术,实现全堆并发标记和并发移动/整理,目标是将 STW 停顿时间控制在 10ms 以内。它们通过其他机制(如优先回收最近分配的对象)来利用对象“朝生夕死”的特性,虽然没有物理分代,但思想上仍然吸收了分代假说的精髓。在较新版本中(如 ZGC for JDK 16+),也开始支持分代模式。
总结
JVM 的分代收集算法是一种基于对象生命周期分布规律(弱分代假说、强分代假说)的垃圾回收策略框架。其核心在于:
-
划分代际: 将堆划分为新生代(对象死亡率高)和老年代(对象存活率高)。
-
对症下药:
-
新生代: 采用高效的复制算法(Minor GC),追求高回收速率和超短 STW 停顿。
-
老年代: 采用标记-清除或标记-整理算法(Major GC / Full GC),更注重空间利用率和避免碎片。
-
-
解决关键问题: 通过记忆集/卡表高效处理跨代引用;通过年龄阈值、动态判定、空间担保等策略管理对象晋升。
-
核心价值: 极大地提高了垃圾回收的效率和针对性,显著减少了大多数情况(Minor GC)下的停顿时间,是 JVM 能够高效管理内存的关键设计。
相关文章:
JVM(8)——详解分代收集算法
JVM 的分代收集算法不是一种具体的垃圾收集算法实现,而是一种指导思想和设计原则,是现代 JVM 垃圾收集器的基石。其核心思想源于对程序运行过程中对象生命周期分布的观察(即弱分代假说)。 核心思想与理论基础:分代假说…...
深入Java面试:从Spring Boot到微服务
深入Java面试:从Spring Boot到微服务 在准备互联网大厂的Java岗位面试时,掌握核心技术栈是关键。本文将从技术栈中选取几个重要的技术点进行探讨,帮助你在面试中脱颖而出。 问题一:Spring Boot的核心特性是什么? 面…...
【软考高级系统架构论文】论无服务器架构及其应用
论文真题 近年来,随着信息技术的迅猛发展和应用需求的快速更迭,传统的多层企业应用系统架构面临越来越多的挑战,已经难以适应这种变化。在这一背景下,无服务器架构(Serverless Architecture) 逐渐流行,它强调业务逻辑由事件触发,具有短暂的生命周期,运行于无状态的轻量…...
Snapchat矩阵运营新策略:亚矩阵云手机打造高效社交网络
1. Snapchat平台特性与风控挑战 Snapchat作为全球领先的即时社交平台,其独特的阅后即焚功能和强社交属性使其风控系统极为严格: 核心风控机制 设备指纹检测:记录设备ID、系统版本、IP地址等硬件信息行为模式分析…...
BGP路由反射器(RR)实验详解,结尾有详细脚本
目录 路由反射器基础概念 实验拓扑与设计 实验配置步骤 配置验证与排错 实验总结 完整配置命令集 路由反射器基础概念 在传统的IBGP网络中,为了防止路由环路,BGP规定通过IBGP学到的路由不能再传递给其他IBGP对等体,这导致所有IBGP路由…...
【JAVA】数组的使用
文章目录 前言一、数组的基本概念1.1 数组的创建和初始化1.2 数组的基本使用 二、数组是引用类型2.1 初始JVM的内存分布JVM内存划分(按功能分区) 2.2 基本类型变量与引用类型变量的区别2.3 再谈引用变量2.4 认识null 三、数组作为函数的参数和返回值四、…...
Python的6万张图像数据集CIFAR-10和CIFAR-100说明
CIFAR-10和CIFAR-100数据集是8000万张微小图像数据集的标记子集。CIFAR-10和CIFAR-100都是由AlexKrizhevsky、VinodNair和GeoffreyHinton创建。数据集说明的网页:https://www.cs.toronto.edu/~kriz/cifar.html 一、CIFAR-10数据集 (一)CIFA…...
CTF--PhP Web解题(走入CTF)
前情提要 分享有趣CTF题目,记录学习过程 题目(带注释,方便理解) <?php // 开启PHP源代码高亮显示,输出当前文件内容(用于调试/展示) highlight_file(__FILE__);// 关闭所有错误报告,防止敏感…...
【Linux仓库】进程概念与基本操作【进程·贰】
🌟 各位看官好,我是! 🌍 Linux Linux is not Unix ! 🚀 今天来学习Linux中进程概念与基本操作。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦!…...
Z-Ant开源程序是简化了微处理器上神经网络的部署和优化
一、软件介绍 文末提供程序和源码下载 Z-Ant (Zig-Ant) 是一个全面的开源神经网络框架,专门用于在微控制器和边缘设备上部署优化的 AI 模型。Z-Ant 使用 Zig 构建,为资源受限的硬件上的模型优化、代码生成和实时推理提供端到端…...
面试题-在ts中类型转换的方法
在 TypeScript 中,类型转换主要分为 类型断言(Type Assertion)、类型守卫(Type Guard) 和 类型兼容转换 三种方式。以下是详细分类和示例: 一、类型断言(Type Assertion) 强制编译…...
【论文笔记】【强化微调】T-GRPO:对视频数据进行强化微调
tulerfeng/Video-R1: Video-R1: Reinforcing Video Reasoning in MLLMs [🔥the first paper to explore R1 for video] 1. 引述 在强化微调中,像 GRPO、DAPO 这样的方法都是对文本或者图片进行微调思考,所以这类微调方法不对时序信息做处理&…...
`shallowReactive` 与 `shallowRef`:浅层响应式 API
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
使用Node.js开发服务端接口
Node.js是一个基于JavaScript的运行时环境,非常适合开发高性能的服务端接口。以下是开发服务端接口的主要方法和步骤。 选择合适的框架 Express、Koa或Fastify是Node.js中常用的框架。Express是最流行的选择,适合快速开发。Koa更轻量,适合需…...
`teleport` 传送 API 的使用:在 Vue 3 中的最佳实践
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
Linux 多种方式实现行转列
目录 一. 前提二. xargs 实现行转列三. paste 实现行转列四. sed 实现行转列 一. 前提 ⏹之前在这下面篇文章中使用sed命令实现了行专列,本篇文章再介绍几种更加简单的方式。 Linux sed案例 👉 20231126-2.log 110120 SPLREQUEST 内容1 AAA memberID1…...
AI与SEO关键词协同进化
内容概要 人工智能(AI)与搜索引擎优化(SEO)的结合,正深刻变革着关键词策略的制定与执行方式。本文旨在探讨AI技术如何驱动SEO关键词领域的智能化进化,核心在于利用AI强大的数据处理与模式识别能力…...
C# 网络编程-关于HTTP/HTTPS的基础(一)
一、HTTP基础概念 1. 请求-响应模型 HTTP是基于客户端-服务器的无状态协议,流程如下: 客户端(如浏览器)发起请求。服务器接收请求并处理。服务器返回响应,包含状态码、Header和响应体。连接关闭,后续请求…...
题解:P11501 [ROIR 2019] 探险队(Day 2)
前言:这道题 dp 做法找环的部分还没有用拓扑做的,补充一下。 这道题其实很像“上司的舞会”,就是求树上最大独立集。 这里我们把每个人向他讨厌的那个人连边(发现所有点出度均为 1 1 1,所以这是一个基环树࿰…...
读者写者问题与读写锁自旋锁
一、读者写者问题 读者写者问题具有以下特点: 一个交易场所---写者写入数据,读者读数据两种角色---读者,写者三种关系 读者和读者---并发写者和写者---互斥读者和写者---互斥 && 同步 二、读者写者VS生产消费 生产者消费者模型中…...
Sublime text启用vim
打开:首选项 > 设置,在打开的输入框中把 "ignored_packages": ["Vintage"] 修改为 "ignored_packages": [],不忽略Vintage,即为启用Vintage,它是Sublime的内置vim插件。 然后再添加&…...
蚂蚁百宝箱快速创建智能体AI小程序
蚂蚁百宝箱官网https://tbox.alipay.com/community?operationSource1006/ 以下是一篇关于蚂蚁百宝箱快速创建智能体 AI 小程序的图文并茂的博客: 标题:蚂蚁百宝箱快速创建智能体 AI 小程序,开启智能应用新体验 引言 在数字化飞速发展的当…...
【Anconda安装教程】安装到环境配置全流程
目录 前言 一、进入官网下载 二、下载Anconda编辑 三、安装Anconda 四、配置环境变量 五、验证是否安装成功 六、anaconda的使用 情况一:电脑现在没有装python或者现在装的可以卸载掉 情况二:电脑目前装了python,但想保留它 6.1 进…...
Linux系统编程 | IPC对象---信号量
在前面两篇博客文章中,对Linux系统编程部分IPC三大对象中的消息队列和共享内存的知识体系做了一个大致的梳理,在本篇文章中,将对三大IPC对象中的最后一个信号量做一个总结。如果有需要的博客朋友,可以参考我的Linux系统编程专栏参…...
当数据自己会说话:聚类与分类算法全景解析
从金融风控到医疗诊断,两种机器学习技术如何重塑决策逻辑 在人工智能与数据驱动的时代,聚类和分类作为机器学习的两大核心技术,已成为从海量数据中提取价值的必备工具。它们看似相似——都是将数据划分到不同的组中——但内在逻辑和应用场景却…...
哈佛结构(Harvard Architecture)与冯·诺依曼架构(Von Neumann Architecture)
一、基础概念与历史溯源 哈佛结构 起源:1940年代由哈佛大学开发的Mark I计算机首次采用,专为弹道计算优化。核心特征: 物理分离的存储器:程序指令存储在ROM/Flash,数据存储在RAM,两者独立编址。独立总线系统…...
Python内存使用分析工具深度解析与实践指南(下篇)
文章目录 引言6. guppy3 / Heapy功能安装程序示例适用场景注意事项 7. objgraph功能安装程序示例适用场景注意事项 8. memory_profiler功能安装程序示例适用场景注意事项 9. profile(标准库)功能程序示例适用场景注意事项 总结对比表 引言 在Python编程…...
经典控制理论:线性化笔记
一、弹簧阻尼系统 求B点的位置X0,与弹簧形变后的位置X1的关系 ---- 解: 二、直流电动机模型 求输出转速与输入电压的关系 解:...
【StarRocks系列】查询优化
步骤参考官网 分析查询 | StarRocks StarRocks-Profile分析及优化指南 StarRocks-Profile分析及优化指南 - 经验教程 - StarRocks中文社区论坛...
【STM32】STM32的中断系统寄存器NVIC、EXTI
文章目录 中断概述中断的概念为什么需要中断STM32的中断 STM32的中断体系架构NVICNVIC的介绍中断优先级优先级寄存器优先级组 EXTI 中断概述 中断的概念 在主程序运行过程中,出现了特定事件,使得CPU暂停当前正在运行的程序,转而去处理这个事…...
LLM-201: OpenHands与LLM交互链路分析
一、核心交互链路架构 #mermaid-svg-ZBqCSQk1PPDkIXNx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZBqCSQk1PPDkIXNx .error-icon{fill:#552222;}#mermaid-svg-ZBqCSQk1PPDkIXNx .error-text{fill:#552222;strok…...
税务 VR 虚拟体验,带来全新办税感受
在过去,企业办税难题诸多。申报纳税高峰期,办税服务厅人满为患,财务人员需早起取号排队,耗费大量时间。传统办税流程复杂,涉及多环节和部门,资料繁多,若准备不全或有误就得重新准备,…...
【Linux 驱动中断】
Linux 驱动中断 一、GIC 控制器:硬件中断的枢纽二、GPIO 中断:设备交互的常见入口三、Tasklet 与软中断:高效的异步处理机制3.1 Tasklet3.2 软中断 四、工作队列:灵活的任务处理框架4.1 共享工作队列4.2 自定义工作队列4.3 延迟工…...
ali 轻量服务器安装nginx
# Ubuntu sudo apt install nginx-light # 精简版 # CentOS sudo yum install nginx #启动并设置开机自启 sudo systemctl daemon-reload sudo systemctl start nginx sudo systemctl enable nginx #验证安装 nginx -v curl -I 127.0.0.1 #常用命令: # 重新加载配…...
2025年- H83-Lc191--139.单词拆分(动态规划)--Java版
1.题目描述 2.思路 字符串s是一个容器(一个背包),wordDict词典是物品,这里面的每个物品我们可以使用多次。 动归五部曲 (1)字符串的长度为i,dp[i]true。 dp[s.size] dp[0]代表空字符串 &#x…...
【好用但慎用】Windows 系统中将所有 WSL 发行版从 C 盘迁移到 非系统 盘的完整笔记(附 异常处理)
🚀 将所有 WSL 发行版从 C 盘迁移到 I 盘的完整教程(含 Podman / NVIDIA Workbench / Ubuntu 等) 【无标题】使用 Chocolatey 安装 WSL 管理工具 LxRunOffline-CSDN博客 免责声明 重要提示 在执行 WSL 迁移操作前,请务必仔细阅读…...
贪心算法思路详解
文章目录 一、贪心算法是什么?二、贪心算法原理三、再谈背包问题四、活动选择问题五、拟阵理论总结 一、贪心算法是什么? 贪心算法与动态规划算法一样是用于求解最优化类问题的算法,其本质上是基于动态规划算法的改进算法,其所求…...
Keil 安装 CMSIS-FreeRTOS 失败解决方案
一、问题现象 在 Keil 中安装 CMSIS-FreeRTOS 时出现以下错误: (1) 通过内置工具安装: (2)通过官网安装: 二、核心原因 Keil 版本过低,与 CMSIS-FreeRTOS 包不兼容: …...
Python打卡DAY33
DAY33:MLP神经网络的训练 恩师浙大疏锦行 知识点: PyTorch和cuda的安装查看显卡信息的命令行命令(cmd中使用)cuda的检查简单神经网络的流程 数据预处理(归一化、转换成张量)模型的定义 继承nn.Module类定义…...
RJ45 网口实现千兆传输速率(1Gbps)的原理,涉及物理层传输技术、线缆标准、信号调制及网络协议等多方面的协同设计。以下从技术维度展开详细解析:
一、千兆以太网的标准与物理层基础 1. 标准规范 千兆以太网遵循 IEEE 802.3ab(针对双绞线)和 IEEE 802.3z(针对光纤)标准,其中 RJ45 接口对应双绞线场景,核心是通过四对双绞线(CAT5e/CAT6 线缆…...
leetcode hot 100之:二叉树的层序遍历
层序遍历和前中后序遍历不一样,大家可以想象的是:前中后序遍历可以用递归,因为他是以子树为标准来选择的;那层序怎么办呢?怎么才能一层层地遍历呢? void First(TreeNode* root) {printf("%d",ro…...
深入解析BERT:语言分类任务的革命性引擎
“BERT的出现,如同在自然语言处理领域投下了一颗认知炸弹——它让机器真正学会了’联系上下文’。” ——自然语言处理研究者普遍共识 在自然语言处理(NLP)领域,2018年诞生的BERT(Bidirectional Encoder Representatio…...
Pycharm中Jupyter Notebook 插件常用快捷键
bg:Jupyter跟LINQPad很像,都是方便写的时候看数据用 快捷键功能Shift Enter执行当前单元格,并跳转到下一个单元格Ctrl Enter执行当前单元格,不跳转(留在当前单元格)Alt Enter执行当前单元格,…...
【Python】Excel表格操作:ISBN转条形码
一、效果 原始文件: 输出文件: 二、代码 import os import logging from openpyxl import load_workbook from openpyxl.drawing.image import Image as ExcelImage from barcode import EAN13 from barcode.writer import ImageWriterlogging.basicCo…...
大数据Hadoop集群搭建
文章目录 大数据Hadoop集群搭建一、VMware准备Linux虚拟机二、VMware虚拟机系统设置1、主机名、IP、SSH免密登录2、JDK环境部署3、防火墙、SELinux、时间同步 三、VMware虚拟机集群上部署HDFS集群1、集群规划2、上传&解压3、Hadoop安装包目录结构4、修改配置文件࿰…...
饼图:数据可视化的“切蛋糕”艺术
饼图,作为数据可视化家族中最经典、最易识别的成员之一,其核心功能如同其名——像切分蛋糕一样,直观展示一个整体(100%)被划分为若干组成部分的比例关系。 往期文章推荐: 20.用Mermaid代码画ER图:AI时代的…...
mysql server层做了什么
服务器处理客户端请求 服务器程序在处理来自客户端的查询请求时,大致需要分为3部分:连接管理、解析与优化、存储引擎。 连接管理 每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程专门处理与这个客户端的交互ÿ…...
3.5.1_1 信道划分介质访问控制(上)
在这个视频中我们要介绍信道划分、介质访问控制,这是两个词,我们先介绍一下什么叫做介质访问控制。 通过之前的学习,我们知道在计算机网络当中,有的信道它在逻辑上属于总线型,我们也可以把这种信道称为广播信道&#x…...
RPC常见问题回答
项目流程和架构设计 1.服务端的功能: 1.提供rpc调用对应的函数 2.完成服务注册 服务发现 上线/下线通知 3.提供主题的操作 (创建/删除/订阅/取消订阅) 消息的发布 2.服务的模块划分 1.网络通信模块 net 底层套用的moude库 2.应用层通信协议模块 1.序列化 反序列化数…...
数据分析和可视化:Py爬虫-XPath解析章节要点总结
重要知识点 XPath 概述:XPath 是一门可以在 XML 文件中查找信息的语言,也可用于 HTML 文件。它功能强大,提供简洁明了的路径表达式和多个函数,用于字符串、数值、时间比较等。1999 年成为 W3C 标准,常用于爬虫中抓取网…...