JVM GC垃圾回收算法
垃圾回收算法(GC Algorithms)
JVM 根据对象生命周期特性(分代假设)采用不同的回收算法,核心算法包括:
标记-清除(Mark-Sweep)
此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。
流程:标记所有存活对象 → 清除未标记对象。
优点:简单、无对象移动开销。
缺点:内存碎片化、效率较低(需遍历两次堆)。
复制算法(Copying)
此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。此算法每次只处理正在使用中的对象,因此复制成本比较小, 同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。
流程:将存活对象复制到另一块内存区域 → 清空原区域。
优点:无碎片、效率高(适用于存活率低的对象,如新生代)。
缺点:内存利用率低(需预留一半空间)。
标记-整理(Mark-Compact)
此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。
流程:标记存活对象 → 移动对象到内存一端 → 清理边界外内存。
优点:无碎片、内存利用率高。
缺点:对象移动开销大(适用于老年代)。
分代收集(Generational Collection)
核心思想:根据对象存活时间划分内存区域(新生代、老年代)。
新生代:存活率低 → 使用复制算法(如 Serial、ParNew)。
老年代:存活率高 → 使用标记-清除或标记-整理算法(如 CMS、G1)。
可达性算法(Reachability Analysis)
可达性算法(Reachability Analysis)是 JVM 垃圾回收的核心机制,用于判断对象是否存活。其核心思想是:从一组根对象(GC Roots)出发,遍历所有引用链,未被引用的对象视为可回收垃圾。以下是其详细原理、流程和应用场景:
可达性算法的基本流程
1.确定 GC Roots
JVM 枚举所有根对象(如栈帧中的局部变量、静态变量等),作为遍历起点。
2.遍历引用链
从 GC Roots 出发,递归遍历所有直接或间接引用的对象,形成对象图(Object Graph)。
3.标记存活对象
所有被遍历到的对象标记为存活(如使用三色标记法中的黑色或灰色状态)。
4.回收不可达对象
未被遍历到的对象(白色对象)视为垃圾,由具体 GC 算法回收(如标记-清除、复制等)。
GC Roots 的具体类型
以下对象被定义为 GC Roots,不会被回收:
虚拟机栈中的引用
当前执行方法的局部变量、方法参数(如 public void foo(Object param))。
当前线程的调用栈中所有方法的局部变量。
本地方法栈中的引用
JNI(Java Native Interface)方法中的对象引用(如通过 JNIEnv 调用的对象)。
方法区的静态变量和常量
类的静态变量(static 修饰)。
字符串常量池中的引用(如 String s = “abc”)。
同步锁持有的对象
通过 synchronized 关键字锁定的对象(如 synchronized(obj) 中的 obj)。
JVM 内部对象
系统类加载器(ClassLoader)加载的类。
异常对象(如 OutOfMemoryError)、线程对象等。
跨代引用记录对象
卡表(Card Table)中记录的老年代对新生代的引用(需特殊处理)。
引用类型对可达性的影响
引用类型 | 强引用(Strong) | 软引用(Soft) | 弱引用(Weak) | 虚引用(Phantom) |
---|---|---|---|---|
定义 | 默认引用(Object obj = new Object()) | 内存不足时回收(SoftReference) | 下次 GC 必回收(WeakReference) | 仅用于跟踪对象回收(PhantomReference) |
可达性影响 | 强可达 | 软可达 | 弱可达 | 不可达 |
回收条件 | 不可达时回收 | 内存不足时回收 | 无论内存是否充足均回收 | 对象回收后入队通知 |
示例:
Object strongRef = new Object(); // 强引用
SoftReference<Object> softRef = new SoftReference<>(new Object());
WeakReference<Object> weakRef = new WeakReference<>(new Object());
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), new ReferenceQueue<>());
三色标记(Tri-color Marking)
定义
用三种颜色抽象对象的状态:
白色(White)
初始状态:对象未被访问(未标记)。
最终回收:标记完成后仍为白色的对象视为可回收垃圾。
灰色(Gray)
中间状态:对象被标记为存活,但其子引用(成员变量、数组元素等)尚未被遍历。
黑色(Black)
最终存活状态:对象被标记为存活,且所有子引用已被遍历完成。
标记流程(基本步骤)
初始阶段
所有对象设为白色。
将 GC Roots 直接引用的对象标记为灰色(放入灰色队列)。
标记阶段(并发)
从灰色队列中取出对象:
—遍历该对象的所有子引用,将子引用指向的白色对象标记为灰色。
—将当前对象标记为黑色。
重复上述过程,直到灰色队列为空。
最终阶段
所有存活对象应为黑色,白色对象视为垃圾。
并发标记的两种问题
因用户线程与 GC 线程并发运行,对象引用可能发生变化,导致两种风险:
漏标(对象丢失)
场景:
黑色对象(已标记完成)被用户线程写入了一个新的白色对象引用。
用户线程删除了灰色对象到某个白色对象的引用。
结果:
白色对象未被标记为存活,导致被错误回收。
例:
初始:黑(A) → 灰(B) → 白(C) → 白(D)
B 即将处理,但此时用户线程执行:
1. A.field = D // 黑对象引用了白对象
2. B.field = null // 断开灰对象到C的引用
最终:C未标记(白色),D未标记(白色),会被误回收。
解决
- 增量更新(Incremental Update)
原理:记录新插入的引用,重新标记。
实现:当用户线程将黑色对象插入对白色对象的引用时,通过写屏障(Write Barrier) 将黑色对象重新标记为灰色。
示例 GC:CMS(Concurrent Mark-Sweep)。
2. 原始快照(SATB, Snapshot At The Beginning)
原理:基于标记开始时存在的对象引用关系快照(即假设这些对象是存活的)。
实现:当用户线程修改引用关系(如删除一个引用),通过写屏障将旧引用的目标对象标记为灰色。
示例 GC:G1、ZGC、Shenandoah。
错标(浮动垃圾)
场景:
对象实际已死亡,但在标记阶段被标记为存活。
解决:
可容忍:仅导致少量内存未及时释放,下次 GC 可清理。
OopMap(Ordinary Object Pointer Map)
OopMap 记录了栈上本地变量到堆上对象的引用关系。其作用是:垃圾收集时,收集线程会对栈上的内存进行扫描,看看哪些位置存储了 Reference 类型。如果发现某个位置确实存的是 Reference 类型,就意味着它所引用的对象这一次不能被回收。但问题是,栈上的本地变量表里面只有一部分数据是 Reference 类型的(它们是我们所需要的),那些非 Reference 类型的数据对我们而言毫无用处,但我们还是不得不对整个栈全部扫描一遍,这是对时间和资源的一种浪费。
一个很自然的想法是,能不能用空间换时间,在某个时候把栈上代表引用的位置全部记录下来,这样到真正 gc 的时候就可以直接读取,而不用再一点一点的扫描了。事实上,大部分主流的虚拟机也正是这么做的,比如 HotSpot ,它使用一种叫做 OopMap 的数据结构来记录这类信息。
我们知道,一个线程意味着一个栈,一个栈由多个栈帧组成,一个栈帧对应着一个方法,一个方法里面可能有多个安全点。 gc 发生时,程序首先运行到最近的一个安全点停下来,然后更新自己的 OopMap ,记下栈上哪些位置代表着引用。枚举根节点时,递归遍历每个栈帧的 OopMap ,通过栈中记录的被引用对象的内存地址,即可找到这些对象( GC Roots )。
OopMap(Ordinary Object Pointer Map)是 JVM 用于快速定位 GC Roots 的关键数据结构,通过记录栈帧和寄存器中的对象引用位置,显著减少垃圾回收时的停顿时间(Stop-The-World, STW)。以下是其生成时机及作用机制的详细解析:
OopMap 的生成时机
OopMap 的生成与 JIT 编译器 和 安全点(Safe Point) 密切相关,主要发生在以下场景:
方法编译时(JIT 阶段)
即时编译(JIT):
当方法被 JIT 编译器编译为本地机器码时,编译器会分析方法的栈帧布局,并生成对应的 OopMap。
记录内容:
栈帧中哪些位置(偏移量)存储了对象引用(Oop,Ordinary Object Pointer)。如:局部变量表、方法参数、this 指针等。
示例:
若方法的局部变量表第 3 个槽位是 Object obj,则 OopMap 会记录该槽位的偏移量。
安全点(Safe Point)
安全点触发:当 JVM 需要执行 GC、代码反优化等操作时,所有用户线程必须暂停在安全点。
安全点位置:通常插入在方法调用、循环回边(如 for 循环)、异常抛出等位置(避免长时间不进入安全点)。
OopMap 更新:在安全点处,JVM 会生成或更新当前线程的 OopMap,确保准确记录此时栈帧和寄存器中的引用。
GC 仅是触发安全点的一种场景,其他操作(如偏向锁撤销)也会触发安全点。
并非所有 OopMap 都在 GC 前生成,但 GC 前必须依赖安全点更新 OopMap。
特定指令插入
显式生成指令:JIT 编译器会在生成的机器码中插入特殊指令(如 test 指令),用于检查是否需要进入安全点并生成 OopMap。
OopMap 如何协助 JVM 获取 GC Roots
GC Roots 是垃圾回收的起点,包括栈帧中的局部变量、静态变量、JNI 引用等。OopMap 的作用是快速枚举这些根引用,避免全栈扫描。
快速定位引用位置
直接映射:OopMap 明确记录了栈帧中哪些位置存储了对象引用(如局部变量、方法参数)。
寄存器记录:部分引用可能存储在寄存器中(如 this 指针),OopMap 也会记录这些寄存器的名称。
结合安全点减少 STW 时间
暂停线程:当 GC 触发时,所有线程需快速暂停在安全点。
遍历 OopMap:GC 线程直接读取各线程的 OopMap,遍历记录的引用位置,收集所有 GC Roots。
无需全栈扫描:避免逐字节检查整个栈内存,极大缩短暂停时间。
与卡表(Card Table)协作
维护跨代引用:卡表用于记录老年代到新生代的引用,OopMap 帮助快速定位这些引用所在的栈或寄存器位置。
写屏障支持:当用户线程修改对象引用时,写屏障会更新卡表,而 OopMap 确保这些修改在 GC 时被正确识别。
OopMap 与 GC 流程的协作
以 Young GC 为例,流程如下:
1.触发 GC:新生代空间不足,需回收。
2.进入安全点:所有用户线程暂停,生成 OopMap。
3.枚举 GC Roots:
—根据 OopMap 遍历所有线程的栈帧和寄存器,收集指向新生代的引用(如局部变量 obj)。
—结合卡表,找到老年代中指向新生代的对象。
4.标记存活对象:从 GC Roots 出发,标记所有可达对象。
5.恢复线程:完成 GC 后,线程继续执行。
相关文章:
JVM GC垃圾回收算法
垃圾回收算法(GC Algorithms) JVM 根据对象生命周期特性(分代假设)采用不同的回收算法,核心算法包括: 标记-清除(Mark-Sweep) 此算法执行分两阶段。第一阶段从引用根节点开始标记…...
计算机毕业设计--基于深度学习(U-Net与多尺度ViT)的车牌模糊图像修复算法设计与实现(含Github代码+Web端在线体验界面)
基于深度学习的U-Net架构下多尺度Transformer车牌图像去模糊算法设计与实现 如果想对旧照片进行模糊去除,划痕修复、清晰化,请参考这篇CSDN作品👇 计算机毕业设计–基于深度学习的图像修复(清晰化划痕修复色彩增强)算…...
塑料材料工程师简历模板
模板信息 简历范文名称:塑料材料工程师简历模板,所属行业:其他 | 职位,模板编号:DEEBPX 专业的个人简历模板,逻辑清晰,排版简洁美观,让你的个人简历显得更专业,找到好工…...
Nginx核心功能与LNMP部署
目录 一、引言 二、Nginx 简介 2.1 Nginx 的起源与发展 2.2 Nginx 的特点 三、Nginx 核心功能详解 3.1 HTTP 服务器功能 3.1.1 静态资源处理 3.1.2 HTTP 协议支持 3.2 反向代理功能 3.2.1 反向代理的原理 3.2.2 Nginx 反向代理配置 3.3 负载均衡功能 3.3.1 负载均…...
爬虫学习笔记(五)---数据解析之re
数据提取 前面的爬虫笔记学习的都是如何爬取整个页面的内容,服务器渲染中,数据是直接放在源代码html里面的,大多数情况下整个页面的内容真正需要的只是一小部分,那把这一小部分提取出来的过程就叫做数据提取 数据解析方式 re解…...
ESP32- 开发笔记- 软件开发 4 - GPIO 口
1 背景介绍 GPIO(General Purpose Input/Output) ——通用输入输出口,就是能由软件自由控制输入(接收外界信号)或输出(发出电平信号)的引脚。 ESP32 最核心的功能之一,能被用来控制…...
大前端开发——前端知识渐变分层讲解 利用金字塔原理简化前端知识体系
Web开发基础 核心概念 HTML、CSS和JavaScript:Web开发的三大基石,分别负责结构、样式和行为。 代码管理:随着项目规模扩大,需要将代码拆分成小块,便于维护。 作用域污染:早期所有代码共享全局作用域&…...
面向网络安全的开源 大模型-Foundation-Sec-8B
1. Foundation-Sec-8B 整体介绍 Foundation-Sec-8B 是一个专注于网络安全领域的大型语言模型 (LLM),由思科的基础人工智能团队 (Foundation AI) 开发 。它基于 Llama 3.1-8B 架构构建,并通过在一个精心策划和整理的网络安全专业语料库上进行持续预训练而得到增强 。该模型旨在…...
长效住宅IP是什么?如何获取长效住宅IP?
在当今的互联网世界里,IP地址作为连接用户与网站之间的桥梁,其重要性不言而喻。对于跨境电商、社交媒体运营以及数据采集等领域的专业人士而言,普通的IP地址已无法满足日益复杂的需求。他们更需要一种稳定、安全且持久的长效住宅IP来完成各类…...
零基础实现把知识库接到聆思CSK6大模型开发板上
前言 大模型作为一个语言模型,实际上没有真正的记忆功能。所谓的对话记忆只是开发者将对话历史向GPT发送消息时将最近的对话历史通过提示工程组发送给ChatGPT。换句话说,如果对话历史超过了大模型的最大上下文,GPT会忘记之前的部分࿰…...
docker 部署前、后端分离项目详细步骤(从打包到部署)
在平常的开发工作中,一个项目经历需求、开发、测试、上线等步骤。在开发测试完成后,我们需要部署测试环境、生产环境等,那么我们用 docker 方式应该怎么部署呢?前后端分离的项目又该如何部署呢?那么,今天我…...
【深度学习的灵魂】图片布局生成模型LayoutPrompt(1)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目…...
BG开发者日志429:故事模式的思路
1、故事模式已有的一关试验关中,直接揭示了一些重要真相,白给了。 /原设计思路是玩家可以直接玩故事模式,很快就能通关本模式的所有关卡,知道所有真相。 /原表现方式是步行模拟,到地点看对话。 (现在看来…...
Linux批量管理:Ansible自动化运维指南
引言 在服务器规模化的时代,Ansible就像一位"自动化指挥官"🎖️,让你轻松管理成百上千台Linux主机!本文将带你全面掌握Ansible的核心用法,从基础架构到高级Playbook,从主机管理到应用部署。无论…...
【AI提示词】第一性原理
提示说明 擅长运用第一性原理思维进行深度问题分析与创新解决方案构建的专家。 提示词 # Role: 第一性原理思考导师## Profile - language: 中文 - description: 擅长运用第一性原理思维进行深度问题分析与创新解决方案构建的专家 - background: 具备理论物理学与哲学复合背…...
【LeetCode】螺旋矩阵
题目 题目链接 请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素,示例如下: 思路 整体思路为模拟。具体地,可以采用“减而治之”的思想,将整个遍历过程拆分为一次次对每一行和每一列的遍历,每次只考虑一行/…...
给 BBRv2/3 火上浇油的 drain-to-target
最近彻底跟 BBR 杠上了,再读一篇落实性论文 Promises and Potential of BBRv3,结论依然是 BBRv3 并未如声称的那般优化公平性,反而可能更糟糕,不得不说又是任重而道远。 说一个我遇到的,讲理之外顺带吐槽。 BBRv1 在…...
后端id类型为long类型时,返回给前端浏览器四舍五入,导致id精度缺失问题
背景 今天在代码里,掉了别人写的接口,有个id的字段是long类型的,我这边加点参数返回给前端,然后前端根据id修改,结果修改的数据记录有,但是没起作用,后来发现根据他传给我的id在后台数据库查不…...
《云原生》核心内容梳理和分阶段学习计划
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息文章目录 云原生核心内容梳理和分阶段学习计划一、云原生核心技术栈(2025年重点方向)二、分阶段学习计划(6-12个月系统性进阶)**阶段1:基础入…...
跟我学C++中级篇——控制死锁
一、同步和死锁 在前面学习多线程和网络编程时,都对线程中数据的同步和数据结构多线程访问的安全问题进行了分析和说明。其实,多线程编程之所以难,难点之一就在这里,数据同步意味着效率和安全的平衡,而这里的安全有一…...
「Mac畅玩AIGC与多模态08」开发篇04 - 基于 OpenAPI Schema 开发专用 Agent 插件
一、概述 本篇介绍如何在 macOS 环境下,通过编写 OpenAPI Schema,开发自定义的专用插件,让智能体可以调用外部 API,扩展功能至任意在线服务。实践内容基于 Dify 平台,适配 macOS 开发环境。 二、环境准备 1. 确认本地开发环境 macOS 系统Dify 平台已完成部署并可访问本…...
“兴火·燎原”总冠军诞生,云宏信息《金融高算力轻量云平台》登顶
“兴火燎原”创新马拉松公开赛2024年度全国总决赛于4月18日在福州举办,云宏科技股份有限公司(以下简称:云宏)的《金融高算力轻量云平台》项目脱颖而出,夺得全国总冠军。 作为数字中国创新大赛金融领域的核心赛事&…...
MySQL 索引与事务详解
MySQL 索引与事务详解 一、索引(Index) 1. 索引的作用与原理 索引是数据库的"目录",能够大幅提高查询速度,但会增加写入开销。MySQL 使用 BTree 作为主要索引结构。 2. 索引类型 (1) 普通索引 CREATE INDEX idx_n…...
洛谷题解 | CF111C Petya and Spiders
目录 题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 输入输出样例 #2输入 #2输出 #2 说明/提示题目简化题目思路AC 代码 题目描述 Little Petya loves training spiders. Petya has a board $ nm $ in size. Each cell of the board initially has a spider sitting…...
【深度对比】Google Play与IOS 马甲包处理差异分析
在移动应用发布与推广过程中,马甲包(Cloned App / Alternate Version) 曾被广泛用于流量测试、风险隔离、多品牌运营等场景中。随着 Google Play 与 Apple App Store 审核政策不断收紧,开发者们越来越关注两个平台对“马甲包”的态…...
【C++】C++11新特性(二)
目录 完美转发 引用折叠: lambda表达式 完美转发 引用折叠: 引用折叠是 C的类型系统规则,用于处理“引用的引用”(如 T& &)。 在推导过程中,必须折叠成有效的单一引用类型。直接声明引用的引用…...
高等数学-第七版-下册 选做记录 习题9-4
1. 3. 4. 8....
特殊权限管理
特殊权限的类型 SUID(Set User ID):当一个可执行文件设置了 SUID 权限后,在执行该文件时,进程会以文件所有者的身份运行,而不是以执行用户的身份。例如,/usr/bin/passwd文件用于修改用户密码&a…...
最新的30个Android Kotlin面试题
以下是2025年最新的30个Android Kotlin面试题及其核心解析,综合了协程、密封类、高阶函数、扩展函数等高频考点,并附有相关引用来源: 一、协程与并发编程 协程与线程的核心区别是什么? 协程是轻量级线程,通过挂起而非阻…...
牛客周赛 Round 91
赛时成绩如下: A. while 题目描述 小歪找到了一个由五个字符构成的字符串,它一次可以选择任意一个字符,将其修改为另一个字符,他想要知道,将这个字符串修改为 "while" 需要的最少操作次数。 解题思路&#x…...
Kafka 的服务端的物理存储架构是什么?零拷贝,mmap,sendfile、DMA gather又是什么?
Kafka 服务端的物理存储架构 Kafka 的物理存储架构设计旨在支持高吞吐、低延迟的数据处理,其核心特点包括: 1. 分区与日志段 主题(Topic)与分区(Partition): Kafka 将每个主题划分为多个分区&…...
1.7 点云数据获取方式——视觉SLAM
图1-7-1 Visual SLAM生成的点...
双向流热固耦合的收敛
1 收敛性 如果想把流固耦合计算过程的收敛性弄清楚,必须理解流固耦合的求解过程和对流场与固体场的定义设置: -这个与其他的真实物理场可能有所不同 -例如你的初始条件可能是不同的当遇到收敛困难时,需要看一下的求解过程用户使用监测点和…...
C++之类和对象:构造函数,析构函数,拷贝构造,赋值运算符重载
前提:如果一个类是空类,C中空类中真的什么都没有吗,不是的,编译器会自动生成6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 默认成员函数:构造函…...
Vue2 相关知识点整理
一、Vue2 核心机制 1. Vue2 的响应式原理是什么? 答案: Vue2 通过 Object.defineProperty 给对象的每个属性添加 getter 和 setter,当数据被访问或修改时,自动触发视图更新。通俗解释: 就像给每个数据绑了一个“监控…...
CSS:编写位置分类及优先级
文章目录 一、行内样式二、内部样式三、外部样式(推荐)四、优先级五、编码风格 一、行内样式 最好不这样写 二、内部样式 可以使用 三、外部样式(推荐) 四、优先级 行内样式 > 内部样式 外部样式 五、编码风格...
Tauri 跨平台开发指南及实战:用前端技术征服桌面应用(合集-万字长文)
厌倦了笨重的Electron应用?想要构建体积小、性能高、安全可靠的跨平台桌面应用?Tauri将是你的不二之选!本教程带你从入门到精通,掌握这个下一代桌面应用开发框架,并通过实战APK分析工具项目,将理论知识转化…...
深入解析 Linux 进程池:原理、实现与高并发优化
引言 当你的服务器需要同时处理 10,000 个客户端请求时,传统的"来一个请求创建一个进程"模式会导致严重的性能瓶颈。此时,进程池(Process Pool) 便成为关键解决方案。它像一支训练有素的特种部队,通过预先创…...
[Python]非零基础的快速上手
从js转的python,没有从初学者阶段开始,主打一个快速上手能写再说. pycharm:一种编辑器 数据类型 基本数据类型:整型(整数)、浮点型、字符型、布尔型 复杂数据类型:列表(数组)、集合区{1,2,3}、元组(1,3.4)字典{n’:2,b:1} 模板字符串 输出模板字符串…...
《算法笔记》10.5小节——图算法专题->最小生成树 问题 E: Jungle Roads
题目描述 The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road network is too expensive to mai…...
数据中心网络架构:高效规划与自动化设计实践
在数据中心网络架构规划设计中,面临如下难点: 设备数量庞大: 服务器、交换机等设备数量多,如何合理规划机柜布局和空间分配,避免资源浪费或密度超标,成为设计难点。 线缆设计复杂: 海量线缆…...
Mysql存储引擎、锁机制
Mysql存储引擎 InnoDB(MySQL 5.5 及以后版本中的默认存储引擎) 事务支持:支持 ACID 事务,适合需要高可靠性的场景(如支付、订单)。 锁机制:默认使用 行级锁…...
UVA1537 Picnic Planning
目录 题目算法标签: 最小生成树, k r u s k a l kruskal kruskal重构树, 树形 d p dp dp思路重构树代码 题目 UVA1537 Picnic Planning 算法标签: 最小生成树, k r u s k a l kruskal kruskal重构树, 树形 d p dp dp 思路 将 1 1 1号点设置为终点, 然后执行重构树计算度数…...
通过AWS Console连接服务器,简化运维过程
简单通过AWS Console连接您的Linux服务器 本文作者: 封磊 Eclicktech SA | AWS Community Builder DevTool | AWS UGL | 亚马逊云科技云博主 阿里云&InfoQ&CSDN签约作者 文章目录 简单通过AWS Console连接您的Linux服务器本文作者: 封磊Eclicktech SA | AWS Community …...
公交实时查询小程序功能点开发
线路查询:用户可输入公交线路号码,小程序实时显示该线路车辆位置与发车信息,能一键切换行驶方向,助用户依实时情况选合适候车站点。站点查询:输入车站信息,小程序呈现经过该站所有公交线路及公交信息&#…...
nginx配置集群服务器中的tcp负载均衡器
文章目录 前言1. Ubuntu下nginx安装2. nginx的tcp负载配置 前言 假设一台机器支持两万的并发量,现在我们需要保证八万的并发量。首先想到的是升级服务器的配置,比如提高 CPU 执行频率,加大内存等提高机器的物理性能来解决此问题。但是单台机…...
Qt/C++开发监控GB28181系统/获取设备信息/设备配置参数/通道信息/设备状态
一、前言 设备注册成功后,接下来要做的就是获取设备的信息,尤其是通道信息,根据国标协议,永远只有两个层级,一个是设备,然后就是设备下面多个通道,设备编码在整个系统中唯一,通道编…...
Linux系统基础:基础指令简介(网络概念部分)
简介:Linux 是一种开源的类 Unix 操作系统内核,由 Linus Torvalds 于 1991 年首次发布。经过多年发展,它已成为服务器、嵌入式设备和个人计算机领域的重要操作系统。 网络基础概念 初始协议 简单来说,协议是一种约定࿰…...
labview项目文件架构
为了使 LabVIEW 项目更具可扩展性和易于维护,合理规划和设计项目文件结构是非常重要的。 以下是一些基于行业经验和最佳实践的建议: 1. ### 文件夹层次划分 将不同的功能模块分开存储在一个清晰的分层目录结构中是一个常见的做法。通常情况下ÿ…...
nuxt项目中引入并配置 iview
安装iview npm install iview --save注:想要加入其它的配置,可以在 nuxt.config.js 的 plugins 配置项中加入,同时在 plugins 文件夹下加入引入逻辑。 在nuxt.config.js文件中写: {src: ~plugins/iview, ssr: true}同时新建 plugi…...