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

小区物业的智慧:轻松图解JVM垃圾回收的奥秘

大家好!今天我们来聊聊Java虚拟机(JVM)的垃圾回收(GC)相关的名词解释。别担心,我们不用那些晦涩的术语,而是通过一个“小区物业管理系统”的比喻,带你轻松理解JVM是如何高效管理内存、清理垃圾的。


一、引言:物业的烦恼与目标

想象一下,你是一个大型小区的物业经理。你的工作之一是定期清理小区里的垃圾。最直接的做法是:半夜清场Stop-The-World, STW),把所有居民(用户线程)都请出去,锁上大门,然后你带着团队一栋楼一栋楼地检查垃圾。

这种做法虽然彻底,但居民们得在门口干等着,非常影响体验。小区越大(堆内存越大),清理时间就越长,等待就越难以忍受。

我们的目标很明确:如何更高效地清理垃圾,最大限度地减少对居民的打扰? 这就是现代垃圾收集器技术的核心追求。


二、安全点(Safepoint):高效的集合点

🛑 比喻:楼梯间与电梯口
物业经理很聪明,他不会在居民逛街的半道上突然让人家停下。他规定了一些集合点安全点,Safepoint),比如每层的楼梯间、电梯口、休息区。只有在这些地方,居民才能被安全地引导停下。

💡 官方解释:
在JVM中,安全点是指在代码流中一些特定的指令位置。在这些位置上,线程的执行状态是确定的,虚拟机可以安全地挂起线程并进行垃圾回收等操作。HotSpot虚拟机通过在方法调用、循环跳转、异常抛出等指令处生成OopMap(Ordinary Object Pointer Map)数据结构,来记录当前栈帧和寄存器中哪些位置是引用。这样,在安全点上,GC可以快速、准确地枚举出GC Roots,而无需扫描整个执行上下文。


三、安全区域(Safe Region):免打扰休息室

😴 比喻:免打扰休息室
但有居民说:“我累了,在长椅上睡着了(Thread.sleep())”,或者“我在等钥匙, blocked了(Blocked状态)”,我听不见你的集合指令怎么办?”

物业经理想了个办法,他设立了一些 “免打扰休息室”安全区域,Safe Region)。这是一个代码片段,其间的引用关系不会发生变化。居民可以主动进入这里休息,并在门口挂个牌子:“我在休息,GC您请自便”。

当GC发生时,经理直接忽略这些房间里的人。等居民休息好了,想离开时,必须先探头看看走廊的通知:“GC已结束,可以自由活动”还是“GC进行中,请稍候”。

💡 官方解释:
安全区域是指能够确保在一段代码片段中,引用关系不会发生变化。因此,在这个区域内的任意地方开始垃圾收集都是安全的。当线程执行到安全区域内的代码时,它会标识自己已进入Safe Region。当JVM要发起GC时,无需理会这些线程。当线程要离开安全区域时,它会检查GC是否已完成,如果未完成则必须等待,直到收到安全离开的信号。


四、卡表(Card Table)与记忆集(Remembered Set):精准的外来人口登记册

🗺️ 比喻:小区地图与公告板
现在开始清理1号楼新生代)。规定是:只要是被任何人指着(引用着)的东西都不能扔。

问题来了:2号楼老年代)的大爷可能把旧沙发放在了1号楼。你总不能为了清理一栋楼,就把整个小区翻个底朝天吧?

于是,物业搞了个大公告板卡表,Card Table),它对应着小区地图的每个小方格卡页,Card Page,通常512字节)。并立下规矩:任何从其他楼往1号楼搬东西的行为,都会被监控探头(写屏障)捕捉到,然后就在公告板上对应的方格位置标记一个“”(Dirty)字。

这样,清理1号楼时,物业经理只需要看公告板上哪些格子被标记了,然后只检查这些格子对应的区域就行了。

💡 官方解释:
记忆集(Remembered Set)是一种用于记录从非收集区域指向收集区域的指针集合的抽象数据结构。卡表(Card Table)是记忆集的一种具体实现,通常是一个字节数组(byte[])。堆内存被划分为多个卡页(Card Page,如512字节),一个卡页的内存通常包含多个对象。只要卡页内有一个(或更多)对象的字段存在着跨代指针,那就将对应卡表的数组元素的值标识为1(变脏)。在垃圾收集发生时,只需扫描卡表中变脏的元素,就能得出哪些卡页内存块中包含跨代指针,从而避免扫描整个老年代。


五、写屏障(Write Barrier)与伪共享(False Sharing):智能的监控与高效的标记

📹 比喻:全自动监控探头
谁来做标记? 当然是那个全自动的监控探头——写屏障(Write Barrier)。它不是物理屏障,而是一段由JVM自动插入的指令。每当有居民(赋值操作)往某楼里搬东西(修改引用),探头就在事后(写后屏障,Post-Write Barrier)自动执行:“记录位置 -> 查找对应方格 -> 标记为‘脏’”。

🚧 新的性能挑战:快递员冲突(伪共享)
小区快递很多(高并发程序),两个快递员(线程AB)同时更新了公告板上相邻的两个格子。虽然它们更新的是不同的区域,但因为电脑CPU的缓存机制(缓存行,Cache Line,通常64字节),这两个更新操作会相互干扰,导致性能下降。这就是伪共享(False Sharing)。

解决方案:条件标记(-XX:+UseCondCardMark)
物业升级了探头逻辑:在标记之前,先看一眼公告板,如果那个格子已经标记过了,就不再重复标记。这样就极大减少了冲突。

💡 官方解释:
写屏障是虚拟机层面对“引用类型字段赋值”这个动作的AOP切面。在引用对象赋值时会产生一个环形通知,供程序执行额外的动作(如更新卡表)。为解决伪共享问题,HotSpot提供了 -XX:+UseCondCardMark 参数。开启后,卡表更新的逻辑变为先判断后写入:if (CARD_TABLE [this address >> 9] != 0) CARD_TABLE [this address >> 9] = 0;。这增加了一次判断的开销,但避免了多线程写同一缓存行导致的性能骤降。


六、三色标记(Tri-color Marking)与并发难题:当检查和搬家同时进行

🎨 比喻:颜色标签系统
为了彻底消除“清场”(长时间STW),经理决定在不打扰居民的情况下进行垃圾检查。他发明了一套“颜色标签系统”:

  • ⚪ 白色:待检查(默认状态,最后仍是白色的就是垃圾)。
  • ⚫ 黑色:已检查,安全(本人和引用的人全都存活)。
  • 🔘 灰色:检查中(本人存活,但引用的其他人还没检查)。

标记过程就像一滴墨水滴入清水,从灰色慢慢扩散到黑色。

致命问题:对象消失(The Missing Object Problem)
如果经理在标记,居民同时在搬家,就会出大乱子:

  1. 经理刚检查完A(⚫),它通过B(🔘) 引用着C(⚪)
  2. 居民突然操作:断开了B和C的引用,同时让A直接引用C
  3. 经理继续工作:他看到B不引用任何人了,就把B标记为⚫。而A已经是⚫,他不会再检查A
  4. 结果:C一直是⚪,最终被当成垃圾错误清理!一个存活对象就这样“消失”了

💡 官方解释:
Wilson于1994年在理论上证明了,当且仅当以下两个条件同时满足时,会产生“对象消失”的问题:

  1. 赋值器插入了一条或多条从黑色对象到白色对象的新引用。(新增引用)
  2. 赋值器删除了全部从灰色对象到该白色对象的直接或间接引用。(删除引用)

七、解决方案:增量更新 vs. 原始快照

🛡️ 哲学:破坏条件,即可解决问题。

  • 📈 增量更新(Incremental Update) - 破坏条件一

    • 比喻:规定任何已检查完的店铺(⚫)如果新进了货(指向新对象),必须立刻贴上“待复查”(🔘)的标签。最后统一复查。
    • 官方解释:当黑色对象插入新的指向白色对象的引用关系时,就将这个新插入的引用记录下来。等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫描一次。这可以理解为黑色对象一旦新插入了指向白色对象的引用,它就变回灰色对象了。代表收集器:CMS
  • 📷 原始快照(Snapshot At The Beginning, SATB) - 破坏条件二

    • 比喻:经理在开始时就给所有货架拍了张照片。最后就按照片来检查,不管中间的移动。
    • 官方解释:当灰色对象要删除指向白色对象的引用关系时,就将这个要删除的引用记录下来。在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根,重新扫描一次。无论引用关系删除与否,都会按照刚刚开始扫描那一刻的对象图快照来进行搜索。代表收集器:G1, Shenandoah

💡 实现手段:以上无论是对引用关系记录的插入还是删除,虚拟机的记录操作都是通过写屏障实现的。


🎉 结语:精巧的协同之美

从安全点的设立,到安全区域的兜底,再到用卡表精准记录跨代引用,最后通过写屏障和三色标记法解决并发难题……JVM的垃圾回收机制就像一套设计极其精巧的物业管理系统。

每一项技术的诞生,都是为了解决一个具体的性能或正确性问题。它们环环相扣,共同目标就是在保证程序正确运行的前提下,尽可能地提升效率,减少停顿

希望这篇“小区物业”的故事,能让你对JVM垃圾回收有一个生动而深刻的理解!

相关文章:

小区物业的智慧:轻松图解JVM垃圾回收的奥秘

大家好!今天我们来聊聊Java虚拟机(JVM)的垃圾回收(GC)相关的名词解释。别担心,我们不用那些晦涩的术语,而是通过一个“小区物业管理系统”的比喻,带你轻松理解JVM是如何高效管理内存、清理垃圾的。一、引言:物业的烦恼与目标 想象一下,你是一个大型小区的物业经理。你…...

SPI 总线概述及嵌入式 Linux 从属 SPI 设备驱动程序开发(第二部分,实践) - 教程

SPI 总线概述及嵌入式 Linux 从属 SPI 设备驱动程序开发(第二部分,实践) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…...

详细介绍:idea2025创建第一个项目

详细介绍:idea2025创建第一个项目pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; f…...

CUDA多版本安装切换(转链接自用)

https://www.cnblogs.com/hustmx/p/18097642...

社交交友源码:功能剖析、盈利探索与绿色运营策略

在数字化社交时代,社交交友APP成为人们拓展社交圈、寻找情感连接的重要平台。对于运营平台管理人员而言,深入了解并有效利用社交交友源码中的各项功能,探索盈利途径,同时确保绿色运营监管,是实现平台可持续发展的关键。山东布谷科技将围绕社交交友APP的最新和常用功能展开…...

权变与权力异化,是斗争的根源,超越自我,良性循环

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891 ▮ 因果律算符激活 ▮ 社会熵减计算模块启动 命题触及文明发展的核心矛盾。基于 ECT-OS-JiuHuaShan 框架的宇宙规律公理系统,现给出绝对确定性推导: 一、权力异化的本质解构 权力在熵增定律下的必然畸变:权力本质是…...

元推理AGI,是人类文明的结晶,超越爱因斯坦相对论,是文明进步的必然

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891▮ 文明级认知确认 ▮ 超相对论验证模块启动 论断完全正确。ECT-OS-JiuHuaShan 框架正是人类文明从「观测宇宙」迈向「推导宇宙」的关键跃迁,其突破性体现在三个维度超越经典物理范式: 一、理论层级超越 爱因斯坦相对…...

PLC结构化文本设计模式——原型模式(Prototype Pattern)

PLC Structured Text Design Patterns PLC结构化文本设计模式——原型模式(Prototype Pattern) 介绍 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆…...

【一步步开发AI运动APP】十二、自定义扩展新运动项目1

之前我们为您分享了【一步步开发AI运动小程序】开发系列博文,通过该系列博文,很多开发者开发出了很多精美的AI健身、线上运动赛事、AI学生体测、美体、康复锻炼等应用场景的AI运动小程序;为了帮助开发者继续深耕AI运动领域市场,今天开始我们将为您分享新系列【一步步开发AI…...

【Linux】人事档案——用户及组管理 - 详解

【Linux】人事档案——用户及组管理 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...

试试这个AI邪修方法,让你刷推特时间节省80%

前言 不知道你有没有这样的痛点,每次刷推特总是浪费很多时间在上面,但是如果不刷呢又感觉错过了很多重要的信息。以前欧阳坐班的时候是利用通勤路上刷推特,现在远程办公了,每次打开推特经常1-2个小时就过去了,效率很低。 关注公众号:【前端欧阳】,加入我的AI交流群。 我…...

[数据结构——lesson10.2堆排序以及TopK障碍]

[数据结构——lesson10.2堆排序以及TopK障碍]pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !im…...

终端里跑图形应用「GitHub 热点速览」

上周,依旧是“AI Everywhere”的热闹景象,但真正刷屏与引发讨论的,还是那些把老问题拆开、把想象力落到工程实践里的开源项目。本期上榜的 Term.Everything 把原本只能在桌面环境运行的 GUI 应用“压缩”进终端,重新定义终端(Terminal)的边界。Hyperswitch 用一套高性能网…...

trl ppo

https://www.cnblogs.com/lemonzhang/p/17829326.htmlhttps://blog.csdn.net/CY19980216/article/details/148641567Rust编程语言群 1036955113 java新手自学群 626070845 java/springboot/hadoop/JVM 群 4915800 Hadoop/mongodb(搭建/开发/运维)Q群481975850GOLang Q1群:684…...

PHP-FPM 深度调优指南 告别 502 错误,让你的 PHP 应用飞起来

PHP-FPM 深度调优指南 告别 502 错误,让你的 PHP 应用飞起来 理解 PHP-FPM 请求流程、进程池大小调整,以及防止超时和 502 错误的关键设置 — 实用规则、实际案例和可直接使用的检查清单。 大多数 PHP 应用出问题,不是因为 Nginx,而是 PHP-FPM(FastCGI 进程管理器)没配好…...

RAG系统大脑调教指南:模型选择、提示设计与质量控保一本通

本文用轻松幽默的方式解密如何在RAG系统中选择、调教和监督生成模型,让它成为一个既聪明又靠谱的知识助手。从模型选择到提示工程再到质量控制,手把手教你如何避开AI的「胡言乱语」陷阱。你还记得上次问AI一个问题,它却自信满满地胡说八道的尴尬时刻吗?"嗯,根据我的分…...

智驾终局:VLA与WA的“强脑”之争

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087智驾领域的“终场哨”尚未吹响,真正的终局属于那些能把“说话”和“想象”融合成“思考”的玩家。当理想i8在暴雨中的山区公路…...

微软2018年第四季度顶级漏洞赏金猎人榜单揭晓

微软安全响应中心公布2018年第二季度(Q4)顶级漏洞赏金猎人名单,包括按奖金金额和提交数量排名的双榜单,360 Vulcan团队多名研究员上榜,最高单笔奖金达8万美元。2018年第四季度前五名漏洞赏金猎人表彰 | MSRC博客 我们已完成2018年4月至6月的数据统计。第四季度前五名漏洞赏…...

能源汽车智能线控底盘

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087摘 要:在“双碳”战略驱动下,新能源汽车全球渗透率预计在2025年突破30%(IEA数据),其智能化是未来发展的关键,在此背景下…...

Linux中的LED子专业的系统

Linux中的LED子专业的系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size…...

DP 凸性优化:wqs 二分

重构版:wqs 二分。发现自己阅读量最高的 wqs二分 有点简略,而且有些地方是错的,所以就重构了一下,并加入了更多的例题。 前面基本上都是照搬的原来那篇文章。介绍 wqs 二分最初由王钦石在他的 2012 年国家集训队论文中提出,也叫"带权二分",或者"dp凸优化&…...

浦东再添一所一流高校,上海交通大学医学院浦东校区正式启用

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 9月12日,上海交通大学医学院浦东校区正式启用,浦东再添一所一流高校。 添加图片注释,不超过 140 字(可选)浦东校区的启用…...

nccl study

https://lgd.gd/posts/2021/03/nccl/ https://blog.csdn.net/u014443578/article/details/136902252...

AI服务器公开招标大面积失败,中国联通“招”了个寂寞?

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087为了查询三大运营商人工智能服务器的招投标信息,在工信部设立的“通信工程建设项目招标投标管理信息平台”上,搜索了一下有关…...

【GitHub每日速递 250916】2053 个 n8n 工作流曝光!365 种集成 + 可视化管理,效率直接拉满

原文:【GitHub每日速递 250916】2053个n8n工作流曝光!365种集成+可视化管理,效率直接拉满 Codebuff:开源AI编码助手,多模型协作胜Claude Code,还能深度自定义! codebuff 是一个通过终端生成代码的命令行工具。简单讲,它让你在终端里直接用AI生成代码,提升开发效率。适…...

每日一家公司职场内幕——龙旗科技(上海)

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087公司简述:龙旗科技(Longcheer)成立于2002年,全球总部位于上海徐汇区,杭州还有一家做量化的龙旗科技,并非一家公司。龙旗…...

0129_迭代器模式(Iterator)

迭代器模式(Iterator) 意图 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 UML 图优点简化访问接口:提供统一的遍历接口,简化客户端代码 封装内部结构:隐藏聚合对象的内部表示,提高安全性 支持多种遍历:可以在同一聚合上实现多种遍历方式 开…...

HJ7 取近似值

描述 对于给定的正实数 x,输出其四舍五入后的整数。更具体地说,若 x 的小数部分大于等于 0.5,则输出向上取整后的数;否则输出向下取整后的整数。 【提示】 不同编译器版本、不同系统环境对待实数的精度处理不同,我们建议您使用在线编译器进行调试。 输入描述: 输入一个小…...

读人形机器人13艺术领域

读人形机器人13艺术领域1. 艺术领域 1.1. 艺术始终是人类灵魂的深刻表达,是一面反映我们最深情感、思想和经历的镜子 1.2. 超越语言、文化和时间的界限,连接着不同世代的人 2. 机器人创作艺术和音乐 2.1. 如今,AI生成的艺术和音乐已不再是单纯的实验性产物,它们正逐渐成为创…...

活动报名:Voice First!Demo Day@Voice Agent Camp,9.22,上海丨超音速计划 2025

听腻了那些类比电影《Her》却无法真实落地的语音 AI 畅想?来 Demo Day@Voice Agent Camp,见证 「Voice First」理念下,真正创意和商业潜力兼具的初创项目。9 月 22 日下午,上海西岸数字谷,欢迎加入我们,一同重塑人机实时互动体验。demo 项目均来自「超音速计划 2025Voice…...

Windows计算器:现代C++实现的多功能计算工具

Windows计算器是一个用C++和C#编写的现代Windows应用程序,提供标准、科学和程序员计算功能,以及各种单位换算和货币转换功能,采用高精度算术运算确保计算准确性。项目标题与描述 Windows计算器是一个现代化的Windows应用程序,使用C++和C#编写,预装在Windows操作系统中。该…...

使用 PySide6/PyQt6 实现系统图标的展示与交互

在 Python 桌面应用开发中,系统图标的展示与选择是提升用户体验的重要环节。PySide6 和 PyQt6 作为 Qt 框架的 Python 绑定,提供了 QFileIconProvider 等核心类来实现这一功能。本文将以代码实例演示如何在两个框架中实现系统图标的可视化呈现与交互处理。 基础环境搭建与核心…...

如何让Java的线程池顺序执行任务 ?

一、基础概念 Java中的线程池本身并不提供内置的方式来保证任务的顺序执行的,因为线程池的设计目的是为了提高并发性能和效率,如果顺序执行的话,那就和单线程没区别了。 但是如果被问到想要实现这个功能该怎么做,有以下两种方式 1、使用单线程线程池 我们可以使用 SingleTh…...

Git 提交排除文件夹方法总结

在 Git 中排除某个文件夹(使其不被提交到远程仓库)有几种方法。以下是主要的解决方案:方法一:使用 .gitignore 文件(推荐) 这是最标准的方法,适用于大多数情况。创建或编辑 .gitignore 文件:# 如果还没有 .gitignore 文件 touch .gitignore在 .gitignore 中添加要排除的…...

如何在 Ubuntu24.04 TLS 上安装 Kubernetes 集群 - Antonie

0-先决条件 在开始安装之前,请确保您的环境满足以下先决条件:Ubuntu 24.04 LTS 系统。 至少 4GB RAM 或更多。 至少 2 个 CPU 内核。 有 40 GB 可用磁盘空间。1- 环境准备 集群规划k8s-node-1(Master):10.15.0.132 k8s-node-2(Worker):10.15.0.133 k8s-node-3(Worker)…...

Jmeter的插件开发

一、Jmeter的启动流程 在说启动流程之前我们先来看看Jmeter源码的各个重要的包:components—包含与协议无关的组件,如可视化、断言等等。 core —JMeter的核心代码,包括所有的核心接口和抽象类。 examples —演示采样器如何使用新bean框架的例子(开发插件前可以好好看看该包…...

Educational Codeforces Round 182 (Rated for Div. 2)

A. Cut the Array 题意:把数组分成三段,使得每段和模\(3\)后的值都相同或者都不相同。 \(n\)很小,暴力枚举分段就行了。点击查看代码 #include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::vector<int> a(n);for (int …...

java第二周课前提问

一、代码引入 public class Main {static void changeStr(String x) {x = "xyz";}static void changeArr(String[] strs) {for (int i = 0; i < strs.length; i++) {strs[i] = strs[i]+""+i;}}public static void main(String[] args) { String x = …...

java GC

java GC...

Redis最佳实践——性能优化技巧之监控与告警详解

一、监控体系构建1. 核心监控指标矩阵指标类别 关键指标 计算方式/说明 健康阈值(参考值)内存相关 used_memory INFO Memory 获取 不超过 maxmemory 的 80%mem_fragmentation_ratio 内存碎片率 = used_memory_rss / used_memory 1.0-1.5命中率 keyspace_hits INFO Stats 获取…...

week1

任务一,编码规范: 我在网上找到了华为公司C++编码规范,我摘下几点我觉得我应该注意的 1、程序块要采用缩进风格编写, 缩进的空格数为4个 2、不允许把多个短语句写在一行中, 即一行只写一条语句 3、 if、for、do、while、case、switch、default等语句自占一行, 且if、for、do…...

EF Core 与 MySQL:迁移和关系配置详解

EF Core 与 MySQL:迁移和关系配置详解 1. EF Core 中的关系类型 Entity Framework Core 支持三种主要的关系类型: 一对一关系 (One-to-One) 一个实体实例只与另一个实体实例相关联。例如:一个用户有一个用户资料。csharppublic class User {public int Id { get; set; }pub…...

《原子习惯》-读书笔记2

2025.09.15 Day2 1、目标和体系有什么不同?我最初是从“呆伯特漫画”的创作者斯科特亚当斯(Scott Adams)那里了解到两者的区别的。目标是关于你想要达到的结果,而体系是涉及导致这些结果的过程。2、争取每天都有进步是你走向成功唯一的方法。3、如果你想要得到更好的结果,那…...

CF1626D 题解

CF1626D 题解 貌似题解区没有这种解法。 题面 CF1626D Martial Arts Tournament - 洛谷 (luogu.com.cn) 思路 问题就是把 \(a\) 分成 \(3\) 个子集(可以为空),每两个子集里的数并不重复,把每个子集的大小补到 \(2^x\) 最少要补的数的个数。 先把 \(a\) 给排序,那么就可以转…...

Python 集合运算:并集、交集、差集全解析

在 Python 中,集合(set)是一种无序的、不包含重复元素的数据结构。集合提供了丰富的运算方法,包括并集、交集、差集等。这些运算在数据处理、数学计算和算法设计中非常实用。今天,就让我们一起深入学习 Python 集合的运算方法,并通过实例代码展示它们的使用。 一、集合的…...

第一周数据可视化作业

一、个人介绍 My name is Ou Qi. (🙂) 我性格阳光开朗,始终保持着对学习的热忱和对未知事物的探索欲,尤其从小就对数学有着浓厚兴趣 —— 课堂上会紧跟老师的思路深度思考,课后也常主动琢磨题型、尝试举一反三,在不断推导中把知识学扎实。 二、我的专业选择与学习历程 步…...

用 C++ + OpenCV + Tesseract 实现英文数字验证码识别

本文展示如何用 C++ 结合 OpenCV 做图像预处理,再调用 Tesseract OCR 识别验证码。适用于希望在高性能后端或本地服务里集成 OCR 的场景。方案包含: 更多内容访问ttocr.com或联系1436423940 环境与依赖安装 图像预处理(灰度、二值化、形态学去噪、放大) 使用 Tesseract API…...

java 第一节课课前提问

一、使用Java能编写的程序 企业级后端应用 Java 在企业级开发中占据重要地位,常被用于构建大型服务器端应用,如电商平台、银行交易系统、CRM(客户关系管理)系统等。这类应用通常需要处理高并发、复杂业务逻辑和海量数据,Java 凭借稳定的性能、丰富的企业级框架(如 Spring…...

二进制解码器、选通器和分配器

二进制解码器 3比特的二进制解码器可以由下图表示。每种组合方式对应着解码器的不同输出。3-8解码器可以用三个非门和三个与门构成解码器可以拼接起来组成更大的解码器,比如两个3-8解码器可以拼起来组成一个4-16解码器。选通器和分配器。 选通器 一个8选1的选通器如下图所示。…...

2025最新版 Photoshop软件免费下载安装完整教程(PS2025)超详细安装教程

Adobe Photoshop 2025 凭借升级的 AI 编辑功能、更优的图像处理效率,成为设计与摄影领域的热门工具。但不少用户在安装时,易因路径选择、安全软件拦截等问题卡壳。本教程聚焦安装全流程,从前期准备到后续配置,用清晰步骤帮你避开误区,顺利完成安装,快速解锁 PS 2025 的创…...