第一章 引言

1.1 JVM 中垃圾收集的简要概述

JVM(Java Virtual Machine)作为 Java 程序的运行时环境,负责将字节码加载至内存并执行,同时也承担着内存管理的重任。垃圾收集(Garbage Collection,简称 GC)是 JVM 中的一项核心机制,用于自动释放不再被使用的内存对象,避免内存泄漏和 OOM(OutOfMemoryError)。

现代 JVM 实现了多种垃圾收集器,每种收集器都有其独特的设计目标和适用场景,从最基本的单线程收集器到并发、并行、高吞吐、低延迟等收集器,为不同类型的应用提供了灵活的选择。

1.2 选择合适垃圾收集器的重要性

在生产环境中,选择合适的垃圾收集器将直接影响系统性能和响应能力。以下几个方面尤为关键:

  • 吞吐量(Throughput):垃圾收集与应用执行时间的比例。

  • 停顿时间(Pause Time):垃圾收集对应用线程的中断时间。

  • 并发能力:是否支持多线程并行或并发地进行垃圾回收操作。

选择错误的收集器可能导致性能瓶颈、频繁 Full GC、应用卡顿,甚至出现频繁 OOM。

1.3 Serial Old 垃圾收集器简介

Serial Old 是一种针对老年代的串行垃圾收集器,它是 Serial 收集器的老年代版本,使用单线程的标记-清除-整理(Mark-Compact)算法。尽管它在多核 CPU 的现代环境中并不高效,但由于实现简单、性能预测性强,它仍在某些特定场景中发挥作用,例如:

  • JVM 在 Client 模式下运行。

  • 作为 CMS 的后备收集器(CMS 出现 Concurrent Mode Failure 时)。

  • 嵌入式、小内存或单核环境。

本博客将全面解析 Serial Old 的工作机制、应用场景及其与其他收集器的对比,并辅以详细的配置参数与示例代码,以帮助读者在实际工作中做出更精准的 GC 策略选择。


第二章 JVM 垃圾收集基础

2.1 什么是垃圾收集?

垃圾收集是自动内存管理的一部分,用于回收不再被任何对象引用的内存资源。在 Java 中,开发者无需手动释放内存,JVM 会定期通过 GC 机制进行扫描、标记和回收。

示例:对象失去引用

public class GCDemo {public static void main(String[] args) {Object obj = new Object();obj = null; // 原来的对象失去引用,变成垃圾对象System.gc(); // 建议 JVM 执行 GC}
}

2.2 JVM 中的垃圾收集工作原理

JVM 利用多种算法识别哪些对象是"垃圾"。其中,引用计数法因无法处理循环引用而被淘汰,现代 JVM 大多使用可达性分析(Reachability Analysis)

  • GC Roots:一组系统定义的起始点(如线程栈、静态字段、JNI 等)。

  • 可达对象:从 GC Roots 可达的对象被视为存活。

2.3 JVM 内存结构(Java 8)

Java 8 中的堆内存主要分为以下几部分:

  • 年轻代(Young Generation):存储新创建的对象,进一步细分为 Eden 和两个 Survivor 区。

  • 老年代(Old Generation):存放从年轻代晋升的长期存活对象。

  • 永久代(PermGen):存储类元信息、静态字段等(Java 8 开始被 MetaSpace 替代,但仍存在于一些文档描述中)。

图示:堆内存结构

+------------------------------------------+
|                Java Heap                 |
+-----------------+------------------------+
|   Young Gen     |     Old Gen            |
|+-----+---------+|                        |
||Eden |Survivors||                        |
|+-----+---------+|                        |
+-----------------+------------------------+

不同代的对象使用不同的垃圾收集器进行回收。Serial Old 专注于老年代。

第三章 深入解析 Serial Old 垃圾收集器

3.1 Serial Old 是什么?

Serial Old 垃圾收集器是 Serial 垃圾收集器在老年代的实现版本,其主要特点如下:

  • 串行(Single-threaded):GC 阶段只有一个线程工作,不具备并行能力。

  • 老年代专属:仅用于回收老年代对象。

  • 使用 Mark-Compact(标记-清除-整理)算法:相比于 Mark-Sweep 算法,其在清除后会对对象进行压缩整理,以减少碎片。

  • 非增量、非并发:GC 期间,所有应用线程(Stop-The-World)都会被暂停,直到回收完成。

虽然 Serial Old 显得比较原始,但其实现稳定、行为可预测,因此在以下几种场景仍有应用价值:

  • Client 模式下的默认老年代收集器

  • CMS 的后备方案(当 CMS 失败时,Fallback 至 Serial Old);

  • 嵌入式、小内存设备或无并发能力的平台

  • 用于测试和教学场景,便于调试 GC 行为。


3.2 Serial Old 的适用场景

尽管现代应用多选择并行或并发 GC,但 Serial Old 仍然适用于以下特定情境:

1. 单核或极低并发设备

如嵌入式设备、路由器、工控设备等,它们本身计算资源受限,无法有效利用并行 GC。

2. 对 GC 可预测性要求高的场景

由于其单线程、逻辑简单,Serial Old 的 GC 行为可预测、易于调试,是性能调优中的一个理想参考对象。

3. 作为 CMS 的后备收集器

在 CMS 收集失败(出现 Concurrent Mode Failure)时,JVM 会自动退回 Serial Old 进行一次完整的 Full GC。

4. 教学、实验或分析场景

由于其可控性高、流程简单,非常适合作为教学或 GC 日志分析的工具。


3.3 Serial Old 的工作原理

Serial Old 使用的是“标记-清除-整理算法(Mark-Compact)”,其具体流程如下:

1. 标记(Mark)阶段

  • 从 GC Roots 出发,通过可达性分析(Graph Traversal)查找所有仍在被引用的对象;

  • 所有被标记的对象被视为“存活”。

2. 清除(Sweep)阶段

  • 遍历整个堆空间,将未被标记的对象视为垃圾,进行清除;

  • 清除后会产生内存碎片

3. 整理(Compact)阶段

  • 将存活对象压缩到内存的一端,腾出连续的空闲区域,防止碎片;

  • 整理过程中需要更新所有引用指针。

整体流程图(文本):

[堆初始状态]
+--A--+--B--+--X--+--Y--+--Z--+
(其中 A/B 为存活对象,X/Y/Z 为垃圾对象)[标记阶段]
标记 A、B[清除阶段]
回收 X、Y、Z[整理阶段]
+--A--+--B--+----------------+

这个过程是“Stop-The-World”的,意味着 GC 期间应用线程必须全部暂停,容易造成长时间停顿,尤其在堆较大时表现更明显。


3.4 Serial Old 的停顿机制

Serial Old 垃圾收集器采用完全的 Stop-The-World 模式,意味着:

  • 在 GC 开始时,所有应用线程都会被暂停;

  • GC 线程单线程执行;

  • GC 完成后,应用线程才会恢复执行。

GC 日志示例

[Full GC (System.gc()) [Tenured: 2048K->512K(10240K), 0.0234560 secs] 4096K->1536K(20480K), [Perm: 2560K->2560K(21248K)], 0.0237890 secs]

说明:

  • Tenured 表示老年代变化(2048K 回收至 512K);

  • 整体耗时为 0.0237890 秒;

  • 发生的是一次 Full GC,使用的正是 Serial Old 收集器。


3.5 Serial Old 与年轻代收集器的搭配

在 JVM 中,老年代收集器通常与年轻代收集器协同工作。Serial Old 常与 Serial 垃圾收集器(年轻代) 组合,构成完整的串行垃圾收集策略,适用于小型应用。

收集器组合示例:

年轻代收集器老年代收集器使用命令行参数
SerialSerial Old-XX:+UseSerialGC

这组组合适用于:

  • 单核 CPU;

  • 需要最大化可预测性;

  • 对延迟要求不高的应用。


3.6 Serial Old 的实现逻辑(简要源码级别概览)

在 OpenJDK 中,Serial Old 的核心实现类如下:

  • MarkSweepCompact:执行标记-清除-整理;

  • CompactibleFreeListSpace:描述老年代的内存结构;

  • GenMarkSweep:负责执行老年代的 Serial Old GC。

伪代码简化如下:

void do_full_gc() {mark();        // 标记存活对象sweep();       // 清除垃圾对象compact();     // 压缩堆,清除碎片
}

虽然整体逻辑简单,但在整理阶段涉及地址计算、指针修复,因此仍需谨慎优化。

 

第四章 Serial Old 与其他垃圾收集器的比较

在 Java 8 中,针对老年代的垃圾收集器主要有三种:Serial OldParallel OldCMS。它们各自具备不同的设计目标和性能特性。本章将通过结构性对比,帮助开发者理解 Serial Old 与其他老年代垃圾收集器之间的差异,以便在特定场景下作出合适选择。


4.1 Serial Old vs Parallel Old

4.1.1 并发能力对比

特性Serial OldParallel Old
是否多线程
回收算法标记-清除-整理标记-清除-整理
应用线程停顿是(STW)是(STW)
吞吐量中等
实现复杂度简单中等
适用场景小堆、单核、Client大堆、多核、Server

4.1.2 说明

  • Parallel Old 是 Parallel Scavenge 年轻代收集器的老年代搭档,适用于对吞吐量敏感的系统;

  • Serial Old 则由于其单线程模型,不适合高并发环境,但在资源受限平台仍有优势;

  • 两者都采用 Mark-Compact 算法,但 Parallel Old 使用多线程并行压缩以缩短 GC 时间。


4.2 Serial Old vs CMS(Concurrent Mark Sweep)

4.2.1 对比表

特性Serial OldCMS(已废弃)
是否多线程
并发能力支持标记、清除阶段并发
回收算法标记-清除-整理标记-清除(无整理)
内存碎片少(有整理)多(无整理)
STW 停顿较短
失败回退-Serial Old
适用场景小堆、嵌入式、备用 GC中等堆、低延迟、高响应需求

4.2.2 说明

  • CMS(Concurrent Mark Sweep) 强调低停顿,但容易产生内存碎片

  • CMS 没有整理(compact)过程,当出现 Promotion Failed 或 Concurrent Mode Failure 时,JVM 会自动切换回 Serial Old 执行 Full GC;

  • CMS 在 Java 9 后被废弃,G1 成为替代方案,但在 Java 8 中仍然是重要的低延迟回收器选择。


4.3 与 G1 的比较(补充)

尽管 G1 属于后代收集器,但了解 Serial Old 与 G1 的差异有助于明确过渡路径。

特性Serial OldG1(Java 9+ 默认)
分代结构固定(Young/Old)Region(动态划分)
是否多线程
并发能力是(并发标记、清理)
回收算法Mark-CompactIncremental Region-based
延迟可控
吞吐量中等中等

4.4 如何选择收集器?

应用类型推荐收集器原因
嵌入式 / 单核Serial + Serial Old简洁、预测性强
高吞吐应用Parallel + Parallel Old最大化 CPU 利用率
响应时间敏感应用CMS(或 G1)停顿时间短,适合交互式系统
大堆 / 高并发G1 或 ZGC多线程回收、并发处理、低延迟

第五章 配置 Serial Old

要在 Java 应用中使用 Serial Old 垃圾收集器,开发者需要通过 JVM 启动参数进行配置。本章将详解 Serial Old 的启用方式、相关 JVM 参数、常见组合方案,并提供适用于不同场景的配置示例。


5.1 如何启用 Serial Old 垃圾收集器

Serial Old 本身并不能独立工作,它通常与年轻代的 Serial 收集器共同配置。完整启用方式如下:

启用命令

java -XX:+UseSerialGC -Xms256m -Xmx256m -jar yourApp.jar

该命令中:

  • -XX:+UseSerialGC:启用 Serial + Serial Old 收集器组合;

  • -Xms-Xmx 设置堆的初始与最大值(建议设置为相同,避免运行时动态扩容)。

一旦启用 Serial GC,老年代自动采用 Serial Old,不需额外指定。


5.2 核心配置参数说明

以下是与 Serial Old 配置密切相关的 JVM 参数:

参数描述
-XX:+UseSerialGC启用 Serial 和 Serial Old 组合收集器
-XX:NewRatio=2老年代与年轻代大小比例,默认值为 2
-XX:SurvivorRatio=8Eden 与 Survivor 区大小比例
-Xms<size> / -Xmx<size>设置堆的初始与最大内存大小
-XX:+PrintGCDetails打印 GC 详细日志
-XX:+PrintGCDateStamps打印 GC 日志时间戳
-Xloggc:<file>输出 GC 日志到指定文件

示例:完整配置参数

java -Xms512m -Xmx512m \-XX:+UseSerialGC \-XX:NewRatio=2 \-XX:SurvivorRatio=8 \-XX:+PrintGCDetails \-XX:+PrintGCDateStamps \-Xloggc:./gc.log \-jar myApp.jar

5.3 常见使用场景下的配置建议

场景一:嵌入式或资源受限环境

java -Xms128m -Xmx128m -XX:+UseSerialGC -jar app.jar
  • 适用于内存资源极小的系统(如 ARM 单板机);

  • 配置简单、稳定,避免多线程 GC 带来的调度开销。

场景二:教学/调试用途(查看 GC 行为)

java -Xms256m -Xmx256m \-XX:+UseSerialGC \-XX:+PrintGCDetails \-XX:+PrintGCDateStamps \-Xloggc:gc.log \-jar app-debug.jar
  • 打印详细 GC 日志便于分析 GC 阶段和时间消耗;

  • 常用于 GC 教程或性能测试。

场景三:CMS 回退配置(无需手动指定)

  • 若应用使用 CMS(-XX:+UseConcMarkSweepGC),

  • 当 CMS 发生 Concurrent Mode Failure,JVM 自动使用 Serial Old 做 Full GC;

  • 可通过 PrintGCDetails 观察 GC 类型判断是否已回退。


5.4 配置建议总结

应用类型建议参数补充说明
嵌入式 / 小型应用-XX:+UseSerialGC简单、可预测性高
调试 / 教学用途+UseSerialGC +PrintGCDetails方便观察 GC 日志
CMS 回退处理默认包含 Serial Old无需显式启用,CMS 失败时自动切换

第六章 Serial Old 性能调优

虽然 Serial Old 垃圾收集器结构简单,但合理的参数调优依然可以帮助开发者减少 GC 频率、缩短停顿时间、提高回收效率。本章将从堆内存配置、晋升策略、GC 日志分析、对象生命周期控制等方面,系统讲解如何优化 Serial Old 的运行性能。


6.1 调优目标与原则

使用 Serial Old 时,调优目标主要聚焦在以下几点:

  • 控制 Full GC 的频率和持续时间;

  • 减少对象在老年代的驻留;

  • 避免因堆空间不足引发频繁 GC 或 OOM;

  • 使 GC 行为更加可预测。

调优时遵循以下原则:

  • 预分配足够内存,减少动态扩容

  • 减少老年代晋升对象的比例

  • 通过日志掌握 GC 节奏和压力点


6.2 堆内存参数调整

合理设置初始堆和最大堆,有助于降低 GC 次数和频繁的内存扩容带来的额外成本。

参数建议:

-Xms512m -Xmx512m    # 初始堆和最大堆设置为一致,防止动态调整
-XX:NewRatio=2       # 年轻代 : 老年代 = 1 : 2
-XX:SurvivorRatio=8  # Eden : Survivor = 8 : 1 : 1

配置解读:

  • 年轻代大,意味着更多对象可以在年轻代被清除,减少晋升到老年代的频率;

  • Survivor 空间适当调大,避免对象提前晋升。


6.3 控制对象晋升到老年代的节奏

在 Serial Old 的使用中,老年代 GC(即 Full GC)是系统停顿的主要来源之一,因此减少对象进入老年代尤为重要。

晋升机制相关参数:

参数描述
-XX:MaxTenuringThreshold=15对象在 Survivor 区经历几次 GC 后晋升老年代
-XX:+PrintTenuringDistribution打印对象年龄分布

示例:

-XX:MaxTenuringThreshold=10
-XX:+PrintTenuringDistribution
  • 设置更高的晋升阈值,有助于让短生命周期对象在年轻代被回收;

  • 通过日志分析,找出哪些对象在晋升前存活较久,从而识别内存热点。


6.4 使用 GC 日志分析 GC 过程

打印 GC 日志是进行调优的基础。通过观察 GC 频率、耗时、堆使用率等指标,可以判断是否需要扩容、调整参数或优化代码。

日志启用示例:

-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc_serial.log

关键指标解析:

  • [Full GC] 出现频率:频繁出现说明老年代压力过大;

  • Tenured: 使用比率:老年代使用接近上限时,GC 会变频繁;

  • GC 耗时:关注 STW 停顿时间,通常在毫秒到秒级不等;

示例日志片段:

2025-07-13T14:22:01.789+0800: 10.123: [Full GC (System.gc())[Tenured: 10240K->512K(10240K), 0.1234567 secs] 20480K->1536K(20480K), [Perm: 2560K->2560K(21248K)], 0.1237890 secs]
  • 可见老年代几乎被占满,引发一次 Full GC;

  • GC 效果较好,但 STW 达到了 123ms。


6.5 分析 GC 热点对象

利用工具进一步分析老年代对象存活情况,有助于识别内存泄漏风险与“长命对象”。

可用工具:

  • JVisualVM:图形界面观察堆中热点类与 GC 行为;

  • MAT(Memory Analyzer Tool):分析 heap dump,找出大对象与 GC roots 路径;

  • JFR(Java Flight Recorder):可跟踪对象生命周期和 GC 事件。


6.6 避免手动调用 System.gc()

默认情况下,调用 System.gc() 会触发一次 Full GC,使用 Serial Old 作为收集器时,会产生较长 STW 停顿,应避免在业务逻辑中显式调用。

关闭自动调用选项:

-XX:+DisableExplicitGC
  • 禁用显式 Full GC 调用,有助于防止代码中不必要的 GC 停顿。


6.7 调优策略总结

调优策略目的
增大年轻代比例减少晋升至老年代的对象数量
延长对象晋升周期提高 Survivor 区利用率
启用 GC 日志定位频繁 GC、观察堆压力点
禁用 System.gc()避免不必要的 Full GC
使用分析工具定位泄漏问题优化内存结构和对象生命周期管理

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88781.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88781.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88781.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker(02) Docker-Compose、Dockerfile镜像构建、Portainer

Docker-Compose 1、Docker Desktop 在Windows上安装Docker服务&#xff0c;可以使用Docker Desktop这个应用程序。 下载并安装这样的一个安装包 安装好后&#xff1a;执行命令 docker --version 从Docker Hub提取hello-world映像并运行一个容器&#xff1a; docker run h…

大数据时代UI前端的用户体验设计新思维:以数据为驱动的情感化设计

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;从 “经验设计” 到 “数据共情” 的体验革命传统 UI 设计常陷入 “设计师主观经…

TypeScript 学习手册

1.TypeScript 概念 TypeScript&#xff08;简称 TS&#xff0c;静态类型&#xff09;是微软公司开发的一种基于 JavaScript &#xff08;简称 JS&#xff0c;动态类型&#xff09;语言的编程语言。TypeScript 可以看成是 JavaScript 的超集&#xff08;superset&#xff09;&a…

掌握现代CSS:变量、变形函数与动态计算

CSS近年来发展迅速&#xff0c;引入了许多强大的功能&#xff0c;如变量、高级变形函数和动态计算能力。本文将深入探讨如何在CSS中设置并使用变量&#xff0c;以及如何有效利用translate3d、translateY和translateX等变形方法。我们还将解析var()和calc()函数的关键作用。一、…

贝尔量子实验设想漏洞

1 0 1 0 1 1 0 1 0 1 1 1 0 0 1 0 带墨镜如果先上下交换再左右交换&#xff0c;很可能不一样的概率是2%&#xff0c;但是因为交换诞生了一个与之前序列相同的所以不一样概率变成1%&#xff0c;我们在测的时候不能这么测啊&#xff0c;你得看序列完…

在 Android 库模块(AAR)中,BuildConfig 默认不会自动生成 VERSION_CODE 和 VERSION_NAME 字段

为什么AAR库模块的 BuildConfig 没有 versionCode 和 versionName&#xff1f; aar库模块的 BuildConfig 默认不包含版本信息 应用模块&#xff08;com.android.application&#xff09;会自动生成 versionCode 和 versionName 到 BuildConfig。但库模块&#xff08;com.androi…

强化学习 (11)随机近似

计算均值的新方法有两种方法。第一种方法很直接&#xff0c;即收集所有样本后计算平均值&#xff1b;但这种方法的缺点是&#xff0c;若样本是在一段时间内逐个收集的&#xff0c;我们必须等到所有样本都收集完毕。第二种方法可避免此缺点&#xff0c;因为它以增量迭代的方式计…

PHP `implode` 深度解析:从基础到高阶实战指南

文章目录一、基础语法与底层原理执行过程解析&#xff1a;二、性能关键&#xff1a;避免隐含陷阱1. 类型转换黑盒2. 大数组内存优化3. 关联数组处理三、高阶应用场景1. SQL语句安全构建2. CSV文件生成3. 模板引擎实现四、多维数组处理方案1. 递归降维2. JSON转换桥接五、性能对…

开发语言中关于面向对象和面向过程的笔记

开发语言中关于面向对象和面向过程的笔记市面主流语言分类面向过程面向对象市面主流语言分类 面向过程编程&#xff08;Procedural Programming&#xff09;&#xff1a;C语言&#xff1b;面向对象编程语言&#xff08;Object-Oriented Programming, OOP&#xff09; &#xf…

AI产品经理面试宝典第3天:技术分层、边界与市场全景系列面试题

面试指导 面试官:请从技术实现效果的角度,解释AI技术分层。 你的回答: AI技术分为三层。 第一层是认知层:通过图像处理、语音识别、自然语言理解等技术,让机器感知环境。比如摄像头识别行人动作,麦克风捕捉用户指令。 第二层是预测层:基于行为数据预判下一步需求。例如…

Intel英特尔ICH7R/ICH8R/ICH9R/ICH10R系列下载地址--intel_msm_8961002 下载 Version 8.9.6.1002

Intel英特尔ICH7R/ICH8R/ICH9R/ICH10R系列下载地址intel_msm_8961002 下载 Version 8.9.6.1002https://xiazai.zol.com.cn/detail/66/653449.shtml通过网盘分享的文件&#xff1a;intel_msm_8961002.zip 链接: https://pan.baidu.com/s/13N9ZLXWkaWaEHQ5P90Jt0g?pwd3790 提取码…

AI(学习笔记第五课) 使用langchain进行AI开发 load documents(web)

文章目录AI(学习笔记第五课) 使用langchain进行AI开发 load documents(web)学习内容&#xff1a;1.load documents&#xff08;web&#xff09;1.1 学习url1.2 提前安装python的package1.2 使用WebBaseLoader进行webpage的load1.3 使用BeautifulSoup4进行webpage的部分截取1.4 …

使用macvlan实现容器的跨主机通信

使用环境&#xff1a; 两台运行docker的服务器 A机器网段&#xff1a;192.168.86.61 B机器网段&#xff1a;192.168.86.62 运行的容器需装有ping指令&#xff0c; 实验参数解释&#xff1a; -d macvlan 指定创建网络驱动类型 --subnet 指定子网范围 -gateway 指定网关地址 -o p…

深度学习_全连接神经网络

1.什么是神经网络神经网络中信息只向一个方向移动&#xff0c;即从输入节点向前移动&#xff0c;通过隐藏节点&#xff0c;再向输出节点移 动&#xff0c;网络中没有循环或者环。其中的基本构件是&#xff1a; 输入层&#xff1a;即输入x的那一层 输出层&#xff1a;即输出y的那…

OpenLayers使用

初学ol&#xff0c;实现了高德地图不同图层的切换、交互性地图飞行以及加载本地JSON数据。说一下不同图层切换的想法&#xff1a;1.对于标准地图和卫星地图&#xff1a;二者最初便挂载到map上&#xff0c;两个图层是叠加显示的&#xff1b;当点击按钮时&#xff0c;其实是使用 …

day4--上传图片、视频

1. 分布式文件系统 1.1 什么是分布式文件系统 文件系统是负责管理和存储文件的系统软件&#xff0c;操作系统通过文件系统提供的接口去存取文件&#xff0c;用户通过操作系统访问磁盘上的文件。 下图指示了文件系统所处的位置&#xff1a; 常见的文件系统&#xff1a;FAT16/FA…

极矢量与轴矢量

物理量分为标量和矢量&#xff0c;矢量又分为极矢量和轴矢量。 矢量是既有大小又有方向并按平行四边形法则相加的量。矢量有极矢量和轴矢量两种&#xff0c;其间的区别是在镜像反射变换下遵循不同的变换规律,许多物理量都是矢量,同样,其中也有极矢量和轴矢量的区分,在力学中,例…

文章发布易优CMS(Eyoucms)网站技巧

为了更快的上手数据采集及发布到易优CMS(eyoucms)网站&#xff0c;特地总结了些新手常常会遇到的操作问题与技巧&#xff0c;如下&#xff1a; 免费易优CMS采集发布插件下载&#xff0c;兼容火车头、八爪鱼、简数采集等 目录 1. 发布到易优CMS指定栏目 2. 发布文章到易优CM…

INA226 数据手册解读

INA226是一款数字电流检测放大器&#xff0c;配备I2C和SMBus兼容接口。该器件可提供数字电流、电压以及功率读数&#xff0c;可灵活配置测量分辨率&#xff0c;并具备连续运行与触发操作模式。该芯片通常由一个单独的电源供电&#xff0c;电压范围为 2.7V 至 5.5V引脚说明​​引…

Linux 中替换sed

以下是关于 sed&#xff08;Stream Editor&#xff09;的深度详解和日常高频使用场景&#xff0c;结合实用示例说明&#xff1a;一、sed 核心概念 流式编辑器&#xff1a;逐行处理文本&#xff0c;不直接修改源文件&#xff08;除非使用 -i 选项&#xff09;正则支持&#xff1…