垃圾收集器-Serial Old

第一章 引言

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…