JVM:垃圾回收
一、垃圾回收概述
(1)垃圾回收主要解决的问题
- 内存溢出:当程序在运行过程中,所需的内存超出了 JVM 被分配到的内存空间时,就会发生内存溢出。垃圾回收会将不再被引用的对象进行回收,释放内存空间,以避免或缓解内存溢出问题
- 内存泄漏:内存泄漏指对象已经不再被使用,但由于某些原因(如持有无用对象的引用),仍然无法被垃圾回收机制回收。垃圾回收机制会尽量识别并解决这种情况,不过一些复杂的内存泄漏场景可能需要开发者手动排查和修复
(2)触发垃圾回收的情况
- 被动触发:
- 当伊甸园区内存空间已满时,会触发 Minor GC,主要回收新生代的垃圾对象
- 当老年代内存空间已满时,通常会触发 Major GC ,在很多情况下,Major GC 会伴随着 Full GC,Full GC 会对整个堆(包括新生代、老年代和方法区等)进行垃圾回收
- 当堆内存的总占用达到 JVM 设置的某个阈值时,也会触发垃圾回收
- 主动触发:程序中调用 System.gc() 或者 Runtime.getRuntime().gc() 方法,这只是向 JVM 发出进行垃圾回收的建议,JVM 并不一定会立即执行垃圾回收操作,它会根据自身的状态和策略来决定是否进行回收
二、垃圾回收相关算法
- 标记 - 清除算法:先标记出垃圾对象,之后统一清除。此方法会产生大量内存碎片,这些碎片难以被有效利用。比如需要存放一个大对象时,分散的内存碎片可能无法提供足够的连续空间(可联想到对象分配内存时的空闲列表法)
- 复制算法:将存活对象从一块内存空间复制到另一块。该算法适用于存活对象较少的场景,复制操作较少,效率较高。但缺点是需要额外的内存空间,实际可用内存变为原来的一半
- 标记 - 整理算法:先标记出垃圾对象,然后把存活对象整理到内存的一侧,接着清除另一侧的垃圾对象。这样解决了标记 - 清除算法产生大量内存碎片的问题,使内存布局更加规整(可联想到对象分配内存时的指针碰撞法)
- 分代回收算法:针对新生代和老年代的不同特点,分别采用不同的垃圾回收算法。新生代中对象存活率较低,采用复制算法效率较高;老年代中对象存活率较高,一般采用标记 - 整理算法,避免内存碎片对后续大对象分配的影响
三、垃圾器 CMS 和 G1的区别
- 回收范围:
- CMS 垃圾回收器主要针对老年代进行垃圾回收,它需要和新生代垃圾回收器(如 Serial 或 ParNew)配合使用,才能实现全堆的垃圾清理
- 而 G1 垃圾回收器打破了传统的新生代和老年代的划分,将堆内存划分为多个 Region,可以独立完成全堆的垃圾回收工作
- 算法使用及内存碎片问题
- CMS 基于标记 - 清除算法,该算法在回收垃圾后容易产生内存碎片
- G1 则更为灵活,对于新生代的 Region 采用复制算法,对于老年代的 Region 采用标记 - 整理算法。复制算法和标记 - 整理算法在处理存活对象时,能有效避免或减少内存碎片的产生。不过严格来说,复制算法和标记 - 整理算法在极端情况下也可能存在少量碎片,但相比标记 - 清除算法要好很多
- 内存整理情况
- CMS 使用标记 - 清除算法,只是简单标记并清除垃圾对象,不会对内存进行整理,从而导致内存碎片。G1 使用的复制算法是将存活对象复制到新的区域,标记 - 整理算法会将存活对象移动到内存的一端,这两种算法都在回收垃圾的同时对内存进行了整理,使内存布局更加规整
- 停顿时间控制:CMS 的设计目标是尽可能缩短垃圾回收时的停顿时间,提高应用的响应性能。但由于每次回收时垃圾的分布和数量难以精确预估,导致停顿时间的波动较大。G1 引入了预测模型,允许用户手动设置最大停顿时间目标。G1 会根据这个目标,优先选择垃圾回收收益最大(即垃圾数量最多)的 Region 进行回收,从而更精准地控制停顿时间
- 浮动垃圾问题:CMS 在并发标记和并发清除阶段,由于应用程序线程和垃圾回收线程同时运行,会产生新的垃圾,这些垃圾被称为浮动垃圾,只能留到下一次垃圾回收时处理。G1 在筛选回收阶段会发生 Stop - The - World,在这个阶段应用程序线程暂停,不会产生浮动垃圾,但在并发标记阶段同样可能产生少量浮动垃圾
四、垃圾回收器
- Serial:它是单线程的垃圾回收器,在进行垃圾回收时,JVM 只会启动一个 GC 线程,并且在回收过程中,应用程序的所有线程都要暂停(Stop - The - World)。由于单线程执行垃圾回收工作,处理任务量较大,因此 Stop - The - World 的时间相对较长。它主要适用于单 CPU 环境下的小型应用程序
- CMS(Concurrent Mark Sweep Collector):这是一款多线程并发的垃圾回收器,JVM 会启动多个 GC 线程并行进行垃圾回收工作。多个线程同时工作使得回收速度加快,能有效缩短 Stop - The - World 的时间,提升应用程序的响应性能。不过,它基于 “标记 - 清除” 算法,在回收后会产生大量内存碎片。CMS 主要用于老年代的垃圾回收,通常需要和 Serial 或 ParNew 等新生代垃圾回收器配合使用
- G1(Garbage - First):G1 是一款面向服务端应用的垃圾回收器,它打破了传统的新生代和老年代的划分方式,将堆内存划分为多个大小相等的独立区域(Region)。G1 可以同时回收新生代和老年代,它会根据每个 Region 中垃圾的数量,优先回收垃圾最多的区域(即 “Garbage - First”)。G1 采用多线程并行回收的方式,在不同的 Region 会根据对象存活情况采用不同的算法,比如在新生代的 Region 采用复制算法,老年代的 Region 采用标记 - 整理算法,以此来避免内存碎片问题
- ZGC(Z Garbage Collector):ZGC 是一种可伸缩的、低延迟的垃圾回收器,适用于堆内存非常大(从几百 MB 到数 TB)的场景。它的设计目标是在尽可能不影响应用程序性能的前提下,高效地回收大量数据,其停顿时间可以控制在 10 毫秒以内,即使在处理海量数据时也能保证极低的延迟
五、如何判断谁是垃圾?
(1)判断垃圾的方法
- 引用计数法:对象每被引用一次,其对应的引用计数器就加 1;每次引用被撤销,引用计数器就减 1。当引用计数器的值为 0 时,该对象就可以被回收。不过,这种方法存在缺陷,例如当 A 对象持有 B 对象的引用,同时 B 对象持有 A 对象的引用,即便它们都不再被其他对象使用,由于双方引用计数器的值都不为 0,这两个对象都无法被垃圾回收,出现类似于 “死锁” 的循环引用情况
-
可达性分析法:从 GC Roots 开始,通过引用链标记可达对象。可达对象不能被回收,不可达对象则可以被回收
(2)GC Roots
- 虚拟机栈中栈帧的局部变量表中的变量:这些变量引用的对象在方法执行期间是可达的
- 方法区中的静态变量:静态变量属于类,在类加载时就存在,它们引用的对象也是可达对象
- 方法区中的常量:引用类型的常量指向堆中的对象,是可达对象的一部分
- 本地方法栈中栈帧的局部变量表中的变量:本地方法栈用于执行本地方法,其中局部变量表中的变量引用的对象同样为可达对象
六、GC的类型
- Minor GC:当伊甸园区空间不足时触发,主要对整个新生代进行垃圾回收。默认情况下,新生代与老年代的空间占比约为 1 : 2 ,新生代空间相对较小。并且新创建的对象大多会存放在新生代的伊甸园区,所以 Minor GC 触发较为频繁。不过由于清理的区域相对较小,且新生代中大部分对象的生命周期较短,很多对象在第一次 Minor GC 时就会被回收,因此 Minor GC 的清理速度通常较快
- Major GC:一般是当老年代空间不足时触发,它主要回收老年代的垃圾对象。虽然部分情况下 Major GC 可能会伴随着 Minor GC 一起执行,但它并不一定会对新生代进行回收。老年代空间较大,且其中存活对象较多,垃圾回收的难度和工作量相对较大,所以清理速度较慢,触发频率也相对较低
- Full GC:触发条件包括方法区内存不足、堆内存达到一定阈值,或者手动调用 System.gc()、Runtime.getRuntime().gc() 方法等。Full GC 会对整个堆内存(包括新生代和老年代)以及方法区进行垃圾回收。由于其清理的范围最广、涉及的对象数量最多,所以清理速度最慢,触发频率也最低
三者的清理速度排序通常为:Minor GC>Major GC>Full GC
七、G1 垃圾回收过程
- 初始标记阶段:触发 G1 垃圾回收时,JVM 开启多个线程进行回收工作。此阶段会发生 Stop - The - World,暂停所有正在运行的 Java 线程,目的是标记出所有从 GC Roots 直接可达的对象。这个阶段的停顿时间较短
- 并发标记阶段:Java 线程恢复运行,与此同时,垃圾回收线程也在后台并发执行。它们会从初始标记阶段标记的对象开始,遍历整个堆,找出所有可达对象,并对对象的引用关系进行标记。该阶段不会影响应用程序的正常运行
- 最终标记阶段(再标记阶段):再次触发 Stop - The - World。在并发标记阶段,由于 Java 线程仍在运行,对象的引用关系可能发生了变化,所以这个阶段会对这些变化进行修正。它会使用 SATB(Snapshot At The Beginning)算法来快速完成检查,而不用扫描整个堆,因此暂停时间相对较短
- 筛选回收阶段:第三次触发 Stop - The - World。在这个阶段,垃圾回收线程会根据各个 Region 的垃圾回收价值(即垃圾数量)进行排序,优先选择垃圾最多的 Region 进行回收。同时,会记录哪些 Region 中有存活对象,哪些 Region 是空的。这一阶段会根据用户设定的停顿时间目标,制定回收计划,尽可能在规定时间内完成垃圾回收工作
- 存活对象处理(转移阶段):垃圾回收线程会对存活对象进行处理。对于属于新生代的 Region,采用复制算法,将存活对象复制到新的空闲 Region 中;对于属于老年代的 Region,采用标记 - 整理算法,把存活对象移动到内存的一端,以消除内存碎片
相关文章:
JVM:垃圾回收
一、垃圾回收概述 (1)垃圾回收主要解决的问题 内存溢出:当程序在运行过程中,所需的内存超出了 JVM 被分配到的内存空间时,就会发生内存溢出。垃圾回收会将不再被引用的对象进行回收,释放内存空间…...
与AI深度融合的Go开发框架sponge,解决使用cursor、trae等AI辅助编程工具开发项目时的部分痛点
摘要 AI 编程助手在近几年快速发展,帮助开发者提升了开发效率。然而,通用 AI 工具往往难以精准落地到具体业务与框架中。本文介绍了一款与 Go 框架深度融合的 AI 编程工具 —— sponge AI 助手。它不仅理解框架的结构,还能按照标准化流程自动…...
《AI大模型应知应会100篇》第21篇:Prompt设计原则:让大模型精准理解你的需求
第21篇:Prompt设计原则:让大模型精准理解你的需求 摘要 在与大模型交互时,如何高效地表达需求是决定输出质量的关键。本文将系统介绍高效Prompt设计的核心原则和方法论,并通过实战代码案例详细解释每个核心知识点,帮助…...
【更新完毕】2025泰迪杯数据挖掘竞赛A题数学建模思路代码文章教学:竞赛论文初步筛选系统
完整内容请看文末最后的推广群 基于自然语言处理的竞赛论文初步筛选系统 基于多模态分析的竞赛论文自动筛选与重复检测模型 摘要 随着大学生竞赛规模的不断扩大,参赛论文的数量激增,传统的人工筛选方法面临着工作量大、效率低且容易出错的问题。因此&…...
[Windows] 电脑自动备份插入的U盘数据
[Windows] 电脑自动备份U盘数据 链接:https://pan.xunlei.com/s/VONyazSEIqhnzZCHRlio9Vw2A1?pwdcmhc# [Windows] 电脑自动备份插入的U盘数据...
《JVM考古现场(二十一):奇点黎明·在事件视界编译时空曲率》
目录 楔子:事件视界警报 上卷时空曲率引擎 第一章:volatile场方程重构 第二章:synchronized黑洞能层 番外篇:时空涟漪观测站 中卷量子逃逸分析 第三章:柯西视界稳定性证明 第四章:白洞负熵连接 实战…...
list的一些常用接口
其实list的接口和前面的string和vector基本都是一样的,用法也基本类似,我们还是挑几个讲讲吧。 一.常用的接口 1.1 push_back 图中是一个空参构造加上一个push_back的使用,这两个接口的使用还是很简单的,看一下即可。下面是迭代器…...
芯洲SCT2434AQFPAR:3.6V-36V Vin, 3.5A, 高效率同步降压DCDC转换器
特性: AEC-Q100合格,结果如下:-器件温度等级1:-40C至125C环境工作温度范围宽输入电压范围:3.6V-36V持续输出电流3.5A 1V1%反馈参考电压集成60mΩ高侧功率MOSFET和36mΩ低侧功率MOSFET轻载PSM工作模式在睡眠模式下具有…...
单例模式:懒汉和饿汉
目录 一、关于设计模式 二、单例模式是什么 2.1 饿汉模式 2.2 懒汉模式 三、单例模式和多线程 3.1 饿汉模式 3.2 懒汉模式 一、关于设计模式 单例模式是一种设计模式,说它之前先来聊聊设计模式是什么。 设计模式,类似于于棋谱(大佬把…...
第八节:React HooksReact 18+新特性-React Server Components (RSC) 工作原理
• 与SSR区别:零客户端JS、服务端数据直出 • 搭配Next.js 14使用场景 React Server Components (RSC) 工作原理及 Next.js 14 应用场景解析 一、RSC 核心工作原理 React Server Components (RSC) 是 React 18 引入的颠覆性特性,其设计目标是 服务端与…...
Spark-SQL核心编程3
数据加载与保存 通用方式: SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用相同的API,根据不同的参数读取和保存不同格式的数据,SparkSQL 默认读取和保存的文件格式为parquet 数据加载方法: spark.read.lo…...
利用XShell 创建隧道(tunnel)在本地可视化远程服务器上的Visdom
1. 创建隧道 打开Xshell,选择你想要操作的终端,单击右键 -> 选择属性 打开属性对话框后,单击添加按钮。 在弹出的对话框中,先填写自己本地的浏览器的地址以及对应的端口号。然后呢,再填写autod远程服务器的地址和…...
React 高级特性与最佳实践
在掌握了 React 的基础知识后,我们可以进一步探索 React 的高级特性和最佳实践。这些特性将帮助你构建更高效、可维护和可扩展的 React 应用。本文重点介绍 Hooks、Context、Refs 和高阶组件等核心高级特性。 1. Hooks:函数组件的强大工具 Hooks 是 Rea…...
考研数据结构之图(一)(包含真题及解析)
考研数据结构之图的存储与基本操作:邻接矩阵、邻接表、十字链表、邻接多重表 图(Graph)是数据结构中的重要非线性结构,广泛应用于网络路由、社交关系分析等领域。本文将详细讲解图的四种主要存储方式——邻接矩阵法、邻接表法、十…...
Qt QML实现Windows桌面颜色提取器
前言 实现一个简单的小工具,使用Qt QML实现Windows桌面颜色提取器,实时显示鼠标移动位置的颜色值,包括十六进制值和RGB值。该功能在实际应用中比较常见,比如截图的时候,鼠标移动就会在鼠标位置实时显示坐标和颜色值&a…...
2025 年网络安全的挑战与机遇
2024 年是网络安全领域风云变幻的一年。从备受瞩目的勒索软件攻击所带来的影响,到人工智能工具日益商品化,挑战不断增加。 关键基础设施的漏洞变得极为明显,身份盗窃次数也达到了前所未有的程度。然而,在这一片混乱之中ÿ…...
Vue 3 中 ref和reactive的详细使用场景
一、核心区别 特性refreactive数据类型基本类型 对象/数组(自动解包)仅对象/数组响应式原理通过 .value 触发响应直接代理对象模板中使用自动解包(无需 .value)直接访问属性解构/传递保持响应性需用 toRefs 保持响应性 二、使用…...
react使用createFromIconfontCN,自定义iconfont 图标
记录reactantdesign项目中使用createFromIconfontCN,自定义iconfont 图标 效果图: import { createFromIconfontCN } from ant-design/icons;const MyIcon createFromIconfontCN({scriptUrl: //at.alicdn.com/t/font_8d5l8fzk5b87iudi.js, // 在 icon…...
危化品经营单位安全生产管理人员备考要点
危化品经营单位安全生产管理人员备考要点 📌 考试核心内容 ✅ 必考法规: 《危险化学品安全管理条例》重点条款(如经营许可条件) GB 18218-2018《重大危险源辨识》新标准 安全生产法律责任(罚款金额/刑事责任&…...
音频炼金术:Threejs 让 3D 场景「听」起来更真实
在 Three.js 中允许在场景中添加声音,将声音与 3D 对象关联,实现更丰富的交互体验。 Audio Three.js 中的Audio对象用于表示音频源,它是一个THREE.Object3D的子类,用于控制音频播放、暂停、是否循环等设置的对象,可以…...
【C++】Stack和Queue的底层封装和实现
目录 stack容器适配器stack的模拟实现 queue的模拟实现deque了解deque的结构deque的管理方式和遍历元素方式deque的缺陷为啥库里面的stack和queue使用deque end stack 容器适配器 Stack可以封装成前面三个变量的形式,但是这里我们提出一个概念叫容器适配器…...
Vue3 SSR 工程化实践:日常工作中的性能优化与实战技巧
一、流式渲染与分块传输(面向性能的关键优化) 1.1 流式响应基础实现 // Node.js Express 示例(Vite SSR同理)import { renderToWebStream } from vue/server-rendererapp.get(/, async (req, res) > { res.setHeader(Conten…...
【Python进阶】字符串操作全解与高效应用
目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现(10个案例)案例1:基础操作案例2:高效格式化…...
LeetCode[28]找出字符串中第一个匹配项的下标(KMP版本)
思路: 一开始我使用暴力过的,但是感觉还是不完美,想学习一下KMP的写法,所以这篇笔记就来了,首先KMP算法就要先维护一个最长相等前后缀的一个数组(统称前缀表),那么这个数组为什么能找…...
Cesium实现雨、闪电、雪、雾天气效果
基于 Cesium 的三维地理信息场景,集成了天气效果后处理、3D 模型加载、水域渲染等功能。以下是详细功能总结: 1. 场景初始化与基础配置 三维地球初始化 创建 Cesium Viewer 实例,隐藏默认控件(时间轴、动画控件等)&…...
上门送水小程序区域代理模块框架设计
一、逻辑分析 代理申请流程: 潜在代理商通过小程序提交代理申请,需要填写个人或企业基本信息、联系方式、期望代理区域等。系统收到申请后,进行初步审核,检查信息的完整性和合规性。运营人员进行人工审核,根据公司政策…...
GIS开发笔记(6)结合osg及osgEarth实现半球形区域绘制
一、实现效果 输入中心点坐标及半径,绘制半球形区域,地下部分不显示。 二、实现原理 根据中心点及半径绘制半球形区域,将其挂接到地球节点。 三、参考代码 void GlobeWidget::drawSphericalRegion(osg::Vec3d point,double radius) {// 使…...
UE5在场景3D物体上播放本地视频(带声音)
UE5在场景3D物体上播放本地视频(带声音) 0.在Map中创建一个立方体,调整大小看起来像屏幕一样 1.创建文件夹Movies在根目录下 2.把准备的视频复制到Movies文件夹下 3.把Movies文件夹下的视频拖入到UE自己创建的文件夹下,此时会有个文件媒体源…...
安装部署RabbitMQ
一、RabbitMQ安装部署 1、下载epel源 2、安装RabbitMQ 3、启动RabbitMQ web管理界面 启用插件 rabbitmq数据目录 创建rabbitmq用户 设置为管理员角色 给用户赋予权限 4、访问rabbitmq...
STM32启动流程详解
STM32启动流程详解 本文档详细介绍STM32微控制器从上电到main函数执行的完整启动流程。 1. 上电与复位过程 当STM32芯片上电或复位时,硬件会执行以下步骤: 上电复位(POR)/低电平复位(PDR): 芯片接通电源或NRST引脚置低时触发初始PC值设置: 程序计数器…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——CPU温度CPU主频
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:https://www.alientek.com/Product_Details/135.html 3)全套实验源码手册视频下载:正点原子资料下载中心 第四章 ATK-DLMP257B功能测试——CPU主频&…...
LVDS系列8:Xilinx 7系可编程输入延迟(一)
在解析LVDS信号时,十分重要的一环就是LVDS输入信号线在经过PCB输入到FPGA中后,本来该严格对齐的信号线会出现时延,所以需要在FPGA内部对其进行延时对齐后再进行解析。 Xilinx 7系器件中用于输入信号延时的组件为IDELAYE2可编程原语࿰…...
iotdb时序数据库使用
iotdb https://github.com/apache/iotdb.git 安装maven3.9.6以上版本执行编译 iotdb启动,使用安装包sbin目录下的start-standalone.bat sbin\start-standalone.bat 执行报错如果是内存问题,可以在对应的node配置中修改,如conf\datanode-ev…...
【Caddy】:现代化、自动 HTTPS 的 Web 服务器新星
🚀 Caddy:现代化、自动 HTTPS 的 Web 服务器新星! 在构建和部署 Web 应用时,你可能听说过或用过如 Nginx、Apache 等经典的 Web 服务器。但在今天,有一个越来越受欢迎的新选择——Caddy。 本文将带你认识 Caddy&…...
用 DeepSeek 精准解析,PDF 一键转电子书!
经常需要阅读大量的 PDF 文档,但在移动设备上阅读 PDF 通常体验极差。屏幕小、排版固定,需要不断放大缩小,眼睛容易疲劳,长时间阅读简直是一种折磨。 虽有不少 PDF 转换工具,但对扫描书籍支持不佳,经常丢失…...
【AIoT】智能硬件GPIO通信详解(二)
前言 上一篇我们深入解析了智能硬件GPIO通信原理(传送门:【AIoT】智能硬件GPIO通信详解(一))。接下来,我们将结合无人售货机控制场景,通过具体案例进一步剖析物联网底层通信机制的实际应用。 在智能零售领域,无人售货机通过AI技术升级为智能柜,其设备控制的底层通信…...
Mac OS系统下kernel_task占用大量CPU资源导致系统卡顿
CPU负载突然飙升,如截图: 根本原因,大家从各种博主上已知晓,现在提供自己的解决办法,亲测有效 一、设置开机自动禁用温度管理守护进程 1.创建脚本文件 mkdir -p ~/Scripts touch ~/Scripts/disable_thermald.sh …...
镜舟科技助力某大型电网企业破解数据架构升级难题,打造国产化湖仓标杆
在 “十四五” 规划全面推进国产化替代的背景下,某大型电网企业联合镜舟科技与腾讯云,基于全球领先的开源分析型数据库 StarRocks 及腾讯 TBDS 大数据平台,构建电力行业国产化湖仓一体架构。该项目实现 PB 级电力数据的统一管理,为…...
Linux内核内存管理单元 详解Linux 内核伙伴系统(Buddy System)的快速路径分配函数get_page_from_freelist
一、函数核心作用 get_page_from_freelist 是 Linux 内核伙伴系统(Buddy System)的快速路径分配函数,负责从指定的内存区域(Zone)中高效分配连续的物理内存页。其核心逻辑是遍历允许的 Zone 列表,检查水位…...
网络原理 - 初识网络 2
目录 OSI 七层协议 TCP / IP 五层模型 网络设备所在分层 网络分层对应 封装和分用(网络传输数据过程中,最核心的流程) 用一个具体例子来梳理以下封装和分用的过程 封装 1. 应用层(应用程序) -- QQ 2. 传输层 …...
如何利用GM DC Monitor快速监控一台网络类设备
GM DC Monitor v2.0在网络类设备监控的效率非常高! 如果您需要管理运维大量的网络类设备,GM DC Monitor是个不错的选择。 如果您具备一定的采集脚本编写能力,可以在平台的定制属于自己的监控模板! 1)首先建立数据中…...
类和对象终
一、初始化列表 再谈构造函数 我们之前实现构造函数的时候,初始化成员变量在函数体内赋值的,构造函数还有一种初始化方式,就是初始化列表 我们先实现一个栈来举例: // 实现一个栈 typedef int DataType; class Stack { public:…...
教程:批量提取图片pdf固定位置文字然后保存为新的文件名,基于Python和阿里云的实现方案
一、项目背景 在实际工作和生活中,存在大量需要对图片或 PDF 进行批量处理的场景。例如,在档案管理中,工作人员可能会扫描大量文件,生成图片或 PDF 格式的档案资料。这些资料通常包含特定位置的关键信息,如文件编号、日期等。通过批量提取这些关键信息并将其作为文件名,…...
JVM:堆、方法区
一、堆 概念:堆用于存储对象和数组,主要分为新生代和老年代,新生代又细分为伊甸园区、幸存者 0 区(S0)和幸存者 1 区(S1)内存设置:可用 -Xmx 和 -Xms 设置堆内存大小,-X…...
JVM-基于Hotspot
前言 Java虚拟机(Java Virtual Machine简称JVM)是运行所有Java程序的抽象计算机,是Java语言的运行环境,其主要任务为将字节码装载到内部,解释/编译为对应平台上的机器指令执行。 Java虚拟机规范定义了一个抽象的——…...
Android 10.0 第三方Launcher设置默认Launcher后导致Recent最近任务键无效
1.前言 在10.0的系统rom定制化开发中,在进入launcher的定制过程中,在某些产品中,需要设置第三方launcher为默认Launcher功能, 所以在设置以后,会发现最近recent键无效,所以接下来需要分析相关流程来实现相关功能的实现 2.第三方Launcher设置默认Launcher后导致Recent最…...
状态模式详解与真实场景案例(Java实现)
模式定义 状态模式(State Pattern) 允许对象在其内部状态改变时改变它的行为,使对象看起来像是修改了它的类。属于行为型设计模式,核心思想是将状态抽象为独立对象,不同状态下行为封装在不同状态类中。 解决的问题 …...
uniapp-商城-26-vuex 使用流程
为了能在所有的页面都实现状态管理,我们按照前面讲的页面进行状态获取,然后再进行页面设置和布局,那就是重复工作,vuex 就会解决这样的问题,如同类、高度提炼的接口来帮助我们实现这些重复工作的管理。避免一直在造一样的轮子。 https://vuex.vuejs.org/zh/#%E4%BB%80%E4…...
科技快讯 | 智谱开源最新GLM模型系列;“AI 洗头店”现身广州;ChatGPT上线图库功能
智谱开源最新GLM模型系列,启用全球域名“Z.ai” 4月15日,智谱开源最新GLM模型系列,包括32B和9B尺寸,涵盖基座、推理、沉思三类模型,全部遵循MIT开源许可协议。推理模型GLM-Z1-32B-0414实测推理速度达200 tokens/秒&…...
LeetCode 2537.统计好子数组的数目:滑动窗口(双指针)
【LetMeFly】2537.统计好子数组的数目:滑动窗口(双指针) 力扣题目链接:https://leetcode.cn/problems/count-the-number-of-good-subarrays/ 给你一个整数数组 nums 和一个整数 k ,请你返回 nums 中 好 子数组的数目。 一个子数组 arr 如果…...