深度分析Java內存回收機制

內存回收機制是Java區別于C/C++等語言的核心特性之一,也是Java開發者理解程序性能、解決內存相關問題(如內存泄漏、OOM)的關鍵。

核心目標: 自動回收程序中不再使用的對象所占用的內存,防止內存耗盡,同時盡量減少對程序執行的影響(特別是停頓時間)。

一、 基礎概念與內存模型

  1. 自動內存管理: Java開發者無需(也無法)像C/C++那樣顯式調用deletefree來釋放對象內存。JVM負責跟蹤所有對象,并在它們“不再被需要”時自動回收其占用的內存。
  2. 內存區域劃分 (JVM Runtime Data Areas):
    • 堆 (Heap): GC工作的主戰場。存放所有對象實例數組。這是GC管理的主要區域。堆是線程共享的。
    • 方法區 (Method Area / Metaspace): 存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。在Java 8及以后,永久代(PermGen)被移除,取而代之的是元空間(Metaspace),它主要使用本地內存(Native Memory)來存儲這些數據,由JVM自行管理其內存回收(主要回收不再使用的類加載器和類信息)。
    • 虛擬機棧 (VM Stack): 線程私有。存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。每個方法調用創建一個棧幀。棧幀隨方法結束而銷毀,其中基本類型變量和對象引用所占內存自動釋放,不涉及GC。棧上分配的對象(逃逸分析優化)理論上也不涉及GC,但主流HotSpot JVM主要采用標量替換優化,對象本身并不在棧上連續分配。
    • 本地方法棧 (Native Method Stack): 為Native方法服務,類似虛擬機棧。
    • 程序計數器 (Program Counter Register): 線程私有。指示當前線程執行的字節碼指令地址。不涉及GC。
    • 直接內存 (Direct Memory): 不是JVM運行時數據區的一部分,但可以通過ByteBuffer.allocateDirect()申請。這部分內存由操作系統管理,但Java的GC機制可以間接管理其關聯的DirectByteBuffer對象。當DirectByteBuffer對象被回收時,其關聯的清理器(Cleaner)會被觸發(通過ReferenceQueue),嘗試釋放對應的直接內存。但這依賴于GC和Cleaner線程的執行。

二、 關鍵概念:對象存活性判斷 - “垃圾”的定義

GC要回收的是“垃圾”,即不再被任何地方引用的對象。判斷對象是否存活的核心算法:

  1. 引用計數法 (Reference Counting):

    • 原理: 每個對象維護一個計數器,記錄有多少引用指向它。當引用被創建(如賦值)時計數器+1;當引用失效(如變量離開作用域、被置為null)時計數器-1。計數器為0的對象即視為“垃圾”。
    • 優點: 實現簡單,判定效率高。
    • 缺點: 無法解決循環引用問題 (A引用B,B引用A,但A和B都不再被外部引用,它們的計數器都不為0,卻永遠無法被回收)。因此,主流的Java虛擬機都不采用引用計數法作為主要的垃圾判定算法
  2. 可達性分析算法 (Reachability Analysis):

    • 原理: 定義一系列稱為**“GC Roots”** 的對象作為起始點集。從這些根節點開始,根據引用關系向下搜索(圖遍歷)。搜索走過的路徑稱為**“引用鏈”**。如果一個對象到GC Roots沒有任何引用鏈相連(即從GC Roots開始不可達),則證明此對象不再被使用,可以被回收。
    • GC Roots 通常包括:
      • 虛擬機棧(棧幀中的局部變量表)中引用的對象。
      • 本地方法棧中JNI(即Native方法)引用的對象。
      • 方法區中類靜態屬性引用的對象(static變量)。
      • 方法區中常量引用的對象(如字符串常量池里的引用)。
      • Java虛擬機內部的引用(如基本數據類型對應的Class對象,常駐的異常對象NullPointerExceptionOutOfMemoryError等,系統類加載器)。
      • 所有被同步鎖(synchronized關鍵字)持有的對象。
      • 反映Java虛擬機內部情況的JMXBean、JVMTI中注冊的回調、本地代碼緩存等。
    • 優點: 解決了循環引用問題。
    • 缺點: 分析過程相對耗時(需要暫停用戶線程 - Stop-The-World, STW)。

三、 引用類型與回收強度

Java將引用分為四類,影響GC行為:

  1. 強引用 (Strong Reference): 最常見的引用類型(Object obj = new Object();)。只要強引用存在,對象就永遠不會被回收。
  2. 軟引用 (Soft Reference): (java.lang.ref.SoftReference) 在內存不足即將發生OOM之前,這些對象會被回收。 常用于實現內存敏感的緩存(如圖片緩存)。回收發生在OutOfMemoryError拋出之前。
  3. 弱引用 (Weak Reference): (java.lang.ref.WeakReference) 下一次GC發生時,無論當前內存是否充足,都會被回收。 常用于實現規范化映射(如WeakHashMap)或監聽器列表,防止因監聽器未注銷導致的內存泄漏。
  4. 虛引用 (Phantom Reference): (java.lang.ref.PhantomReference) 最弱的引用。無法通過虛引用獲取對象實例。對象被回收時,虛引用會被放入關聯的ReferenceQueue 主要用于在對象被回收時收到一個系統通知(通過檢查ReferenceQueue),用于執行一些資源清理工作,例如DirectByteBuffer的清理器。

四、 垃圾收集算法 - 方法論

  1. 標記-清除算法 (Mark-Sweep):

    • 過程:
      1. 標記 (Mark): 從GC Roots開始,遍歷所有可達對象,進行標記(通常是在對象頭中置位)。
      2. 清除 (Sweep): 遍歷整個堆,回收所有未被標記的對象所占用的空間。
    • 優點: 簡單直接。
    • 缺點:
      • 效率問題: 標記和清除兩個過程的效率都不高(遍歷整個堆)。
      • 空間問題: 回收后會產生大量不連續的內存碎片。碎片過多可能導致后續分配較大對象時找不到足夠的連續內存,從而觸發另一次GC。
  2. 復制算法 (Copying):

    • 過程: 將可用內存按容量劃分為大小相等的兩塊(A區和B區)。每次只使用其中一塊(如A區)。當A區滿了,觸發GC:將A區中所有存活的對象復制到B區,然后一次性清理掉整個A區。下次使用B區,如此往復。
    • 優點:
      • 效率高: 只需移動存活對象(通常存活對象少),按順序分配內存,沒有碎片。
      • 實現簡單: 清除就是清空整個半區。
    • 缺點:
      • 內存利用率低: 總有一半內存空閑,浪費空間。
      • 存活對象多時效率下降: 復制大量對象開銷大。
    • 應用: 非常適合對象朝生夕死(存活率低)的新生代。HotSpot JVM的新生代(Eden + S0/S1)就是基于復制算法優化(Appel式回收)。
  3. 標記-整理算法 (Mark-Compact):

    • 過程:
      1. 標記 (Mark): 同標記-清除。
      2. 整理 (Compact): 將所有存活的對象向內存空間的一端移動(滑動),然后直接清理掉邊界以外的所有內存
    • 優點:
      • 沒有內存碎片: 移動后空間連續。
      • 內存利用率高: 不像復制算法浪費一半空間。
    • 缺點:
      • 效率相對較低: 移動存活對象需要更新引用地址(需要STW),且移動本身耗時。
    • 應用: 適合存活對象較多的老年代(Tenured/Old Generation)。
  4. 分代收集算法 (Generational Collection): 現代商用JVM的主流算法!

    • 核心思想: 基于對象生命周期的不同,將堆內存劃分為不同的代(Generation),對不同代采用最適合的收集算法。
    • 堆內存劃分:
      • 新生代 (Young Generation): 存放新創建的對象。特點:絕大多數對象在這里快速死去(生命周期短)。劃分為:
        • Eden區: 新對象誕生地。
        • Survivor區 (S0/S1, From/To): 兩個大小相等的區域,用于保存經過一次Minor GC后存活的對象。
      • 老年代 (Old/Tenured Generation): 存放在新生代中經歷多次GC后仍然存活的對象(生命周期長)。也存放大對象(超過-XX:PretenureSizeThreshold設置值,直接進入老年代)。
      • 永久代/元空間 (PermGen/Metaspace): (如前所述,Java 8+為Metaspace) 存放類元數據、常量池等。其GC行為獨立于堆。
    • GC類型:
      • Minor GC / Young GC: 只回收新生代的垃圾。觸發頻繁,速度快(因為新生代小且對象存活率低,通常采用優化的復制算法)。
      • Major GC / Full GC: 回收整個堆(包括新生代、老年代)以及(通常)方法區(Metaspace)的垃圾。觸發頻率低,速度慢(因為老年代對象存活率高,可能采用標記-清除或標記-整理算法),STW時間長,對應用性能影響大。應盡量避免頻繁Full GC。
    • 對象分配與晉升:
      1. 新對象優先在Eden區分配。
      2. 當Eden區滿,觸發Minor GC
        • 將Eden區和當前使用的Survivor區(如S0)中存活的對象,復制到另一個空閑的Survivor區(如S1)。
        • 同時,給每個存活對象年齡+1(記錄在對象頭中)。
        • 清空Eden區和剛使用過的Survivor區(S0)。
        • S0和S1角色互換(原來的To變成新的From)。
      3. 當一個對象在Survivor區中“熬過”一定次數的Minor GC(年齡達到閾值 -XX:MaxTenuringThreshold,默認15),它會被晉升 (Promotion)老年代
      4. 如果Survivor區空間不足(無法容納Eden和另一個Survivor的存活對象),或者存活對象過大,會直接進入老年代(提前晉升分配擔保失敗)。
      5. 老年代空間不足時,會嘗試觸發Major GC/Full GC

五、 垃圾收集器 - 算法實現者

JVM提供了多種垃圾收集器,適用于不同場景(吞吐量優先、低延遲優先、大堆內存等)。不同收集器可能用于不同分代。

  1. Serial 收集器:

    • 單線程工作。
    • 進行GC時,必須暫停所有用戶線程(STW)。
    • 簡單高效,沒有線程交互開銷。
    • 應用場景: 客戶端模式或資源受限的嵌入式系統。-XX:+UseSerialGC (新生代Serial + 老年代Serial Old)。
  2. ParNew 收集器:

    • Serial收集器的多線程并行版本(僅作用于新生代)。
    • 多線程并行進行標記和復制。
    • GC時仍需STW。
    • 應用場景: Server模式下與CMS收集器配合使用的主流新生代收集器。-XX:+UseParNewGC (需搭配老年代CMS)。
  3. Parallel Scavenge / Parallel Old 收集器:

    • 吞吐量優先收集器。
    • Parallel Scavenge: 新生代收集器,多線程并行復制算法。
    • Parallel Old: 老年代收集器,多線程并行標記-整理算法。
    • 關注點:可控制的吞吐量 (用戶代碼運行時間 / (用戶代碼運行時間 + GC時間))。可通過-XX:MaxGCPauseMillis(最大GC停頓時間目標)和-XX:GCTimeRatio(吞吐量目標)參數調節。
    • 應用場景: 后臺運算、批處理任務等對吞吐量敏感的應用。-XX:+UseParallelGC / -XX:+UseParallelOldGC
  4. CMS 收集器 (Concurrent Mark-Sweep):

    • 低延遲優先收集器,目標是減少STW時間(尤其是老年代回收的停頓)。
    • 老年代收集器,基于標記-清除算法
    • 過程 (四個主要階段):
      1. 初始標記 (Initial Mark): (STW) 標記GC Roots直接關聯的老年代對象。速度很快。
      2. 并發標記 (Concurrent Mark): GC線程與用戶線程并發執行,遍歷老年代對象圖進行可達性分析。
      3. 重新標記 (Remark): (STW) 修正并發標記期間因用戶線程繼續運行而導致標記產生變動的那一部分對象的標記記錄。比初始標記時間長,但遠短于并發標記。
      4. 并發清除 (Concurrent Sweep): GC線程與用戶線程并發執行,清除不可達對象。
    • 優點: 并發階段(標記和清除)大大減少了STW時間。
    • 缺點:
      • CPU資源敏感: 并發階段占用線程,會與應用線程爭搶CPU。
      • 浮動垃圾 (Floating Garbage): 并發清理階段用戶線程還在運行,會產生新的垃圾,只能留到下一次GC清理。
      • 內存碎片: 標記-清除算法導致。可能觸發Full GC(Serial Old)進行碎片整理。
      • Concurrent Mode Failure: 如果在并發清理完成前老年代空間被填滿(通常是晉升太快或浮動垃圾過多),會觸發Serial Old進行Full GC(導致長時間STW)。需預留足夠空間(-XX:CMSInitiatingOccupancyFraction)。
    • 應用場景: 對響應時間敏感的B/S系統、Web服務等。-XX:+UseConcMarkSweepGC (新生代通常配合ParNew)。
  5. G1 收集器 (Garbage-First):

    • JDK 9+ 的默認收集器。目標是在可控的停頓時間內獲得盡可能高的吞吐量,并支持超大堆(數十GB甚至更大)。
    • 核心思想: 將堆劃分為多個大小相等的獨立區域(Region)。G1跟蹤各個Region里垃圾堆積的“價值”(回收所得空間大小以及回收所需時間),在后臺維護一個優先列表。每次根據用戶設定的允許停頓時間(-XX:MaxGCPauseMillis,默認200ms),優先回收價值最大的Region(Garbage-First)。
    • 特點:
      • Region分區: 物理上不再連續分代,但邏輯上仍保留新生代、老年代概念(由一組Region組成)。有特殊的Humongous Region用于存放大對象。
      • Mixed GC: G1除了常規的Young GC(只收集Eden/Survivor Region),還有一種Mixed GC模式。Mixed GC不僅收集新生代Region,也會根據預測模型選擇部分價值高的老年代Region進行收集。這是G1實現老年代回收的主要方式。
      • 算法: 整體基于標記-整理算法,局部(Region之間)基于復制算法。避免了CMS的內存碎片問題。
      • 可預測停頓模型: G1能建立停頓預測模型,有計劃地選擇部分Region進行回收,確保在指定的停頓時間內完成垃圾收集。
      • Remembered Sets (RSet): 每個Region都有一個RSet,記錄其他Region中指向本Region內對象的引用。避免全堆掃描,使Region的回收相對獨立。
      • Collection Sets (CSets): 每次GC時被選中回收的Region集合。
    • 過程 (簡化):
      1. 初始標記 (Initial Mark): (STW) 標記GC Roots直接關聯的對象,并修改TAMS指針(為并發標記做準備)。通常與一次Young GC一起完成。
      2. 并發標記 (Concurrent Mark): 并發遍歷堆,進行可達性分析。
      3. 最終標記 (Final Marking): (STW) 處理SATB(Snapshot-At-The-Beginning)記錄,修正并發標記期間的變化。
      4. 篩選回收 (Evacuation): (STW) 根據停頓預測模型,選擇價值高的Region組成CSet,將CSet中存活的對象復制到空閑Region(復制算法),同時清空原Region(標記-整理效果)。這個階段是多線程并行進行的。
    • 優點: 兼具高吞吐和低延遲潛力、無碎片、可管理超大堆。
    • 應用場景: 需要低延遲、大內存的現代應用。-XX:+UseG1GC
  6. ZGC (Z Garbage Collector) 和 Shenandoah:

    • 目標: 將STW時間控制在10ms以內,且與堆大小無關(亞毫秒級到10ms級),適用于超大堆(TB級)。
    • 核心技術:
      • 著色指針 (Colored Pointers): (ZGC) 在指針中嵌入元數據(標記位、重映射位等),避免傳統GC需要對象頭存儲標記信息的開銷。
      • 讀屏障 (Read Barrier): 在應用程序線程讀取對象引用時,插入一小段代碼(屏障),配合著色指針實現并發轉移(對象移動時,應用線程通過屏障能感知到并訪問到對象的新地址)。
      • 并發轉移 (Concurrent Relocation/Marking): GC線程與用戶線程并發地完成對象的標記和轉移(壓縮)。
    • 特點: 幾乎全程并發,STW時間極短且固定(ZGC的STW主要發生在根掃描階段,與GC Roots數量有關,與堆大小無關)。
    • 應用場景: 對延遲極其敏感的超大規模應用(金融交易、實時分析等)。-XX:+UseZGC (JDK 15+ Production Ready) / -XX:+UseShenandoahGC (需要額外支持)。

六、 GC調優要點與常見問題

  1. 理解目標: 明確調優目標(吞吐量?低延遲?最小化內存占用?)。
  2. 選擇合適的收集器:
    • 小應用/Client:Serial
    • 吞吐量優先:Parallel Scavenge / Parallel Old
    • 低延遲/響應優先:CMS (JDK 8及之前), G1 (JDK 9+ 默認且推薦)
    • 極致低延遲/超大堆:ZGC / Shenandoah (JDK 11+)
  3. 調整堆大小:
    • -Xms / -Xmx:設置堆的初始大小和最大大小。通常設置成一樣大,避免堆自動擴展收縮帶來的開銷。
    • 過小:頻繁GC,影響吞吐量。
    • 過大:單次GC停頓時間長,增加OS管理開銷。
  4. 調整新生代/老年代比例:
    • -XX:NewRatio (老年代/新生代比例,默認2,即老年代是新生代的2倍)
    • -XX:SurvivorRatio (Eden/Survivor比例,默認8,即 Eden:Survivor=8:1)
    • 根據對象生命周期特點調整。短命對象多,增大新生代比例。
  5. 避免過早晉升:
    • 增大-XX:MaxTenuringThreshold
    • 增大Survivor區大小(通過-XX:SurvivorRatio或直接設置-XX:SurvivorSize)。
    • 確保Survivor區能容納每次Minor GC后的存活對象。
  6. 處理大對象:
    • 避免創建過大的對象數組。
    • 調整-XX:PretenureSizeThreshold,讓大對象直接進入老年代(減少在新生代的復制開銷)。
  7. 監控與分析:
    • JVM參數: -XX:+PrintGCDetails-XX:+PrintGCDateStamps-Xloggc:<file> 記錄GC日志。
    • 工具:
      • jstat:命令行查看JVM統計信息(GC次數、時間、各代容量使用率等)。
      • VisualVM:圖形化監控(堆、線程、GC等)。
      • Java Mission Control (JMC):更強大的監控診斷工具(Flight Recorder)。
      • GC日志分析工具: GCViewer, GCEasy, HPjmeter 等,可視化分析GC日志。
  8. 識別與解決內存泄漏:
    • 現象: Full GC越來越頻繁,每次回收后老年代可用內存越來越少,最終OOM。
    • 原因: 對象已不再使用,但由于意外的強引用(如靜態集合類長期持有、監聽器未注銷、未關閉的資源如Connection/Statement/Stream)導致無法被回收。
    • 診斷工具:
      • jmap -histo:live <pid>:查看堆直方圖(強制觸發Full GC)。
      • jmap -dump:live,format=b,file=heapdump.hprof <pid>:生成堆轉儲文件。
      • MAT (Memory Analyzer Tool), VisualVM Heap Dump Analyzer: 分析堆轉儲文件,查找支配樹、可疑引用鏈、大對象等。

七、 總結

Java的垃圾回收機制是其自動內存管理的核心,通過可達性分析判定對象生死,并主要采用分代收集思想結合多種算法(復制、標記-清除、標記-整理)來高效回收內存。不同的垃圾收集器(Serial, Parallel, CMS, G1, ZGC, Shenandoah)針對不同的性能目標(吞吐量、延遲、堆大小)進行了優化。理解GC的工作原理、內存模型、不同收集器的特點以及調優方法,對于開發高性能、高可靠的Java應用至關重要。持續監控GC行為,結合日志分析和堆轉儲工具定位問題,是優化應用內存使用和性能的有效手段。隨著硬件發展(大內存、多核)和應用需求(低延遲)的演進,GC技術(如ZGC, Shenandoah)也在不斷創新,追求更短的停頓時間和更大的堆管理能力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90400.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90400.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90400.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp “requestPayment:fail [payment支付寶:62009]未知錯誤“

解決方案&#xff1a;兄弟&#xff0c;有一種可能是你用測試機沒有安裝支付寶

分布在內側內嗅皮層(MEC)的帶狀細胞對NLP中的深層語義分析的積極影響和啟示

帶狀細胞&#xff08;Band Cells&#xff09;作為內側內嗅皮層&#xff08;Medial Entorhinal Cortex, MEC&#xff09;層Ⅱ/Ⅲ的核心空間編碼單元&#xff08;如網格細胞、頭方向細胞等&#xff09;&#xff0c;其獨特的神經計算機制為自然語言處理&#xff08;NLP&#xff09…

綜合實驗(4)

文章目錄 目錄 文章目錄 前言 實驗配置 實驗總結 總結 前言 Cisco IOS Site-to-Site VPN&#xff08;虛擬專用網絡&#xff09;是一種通過公共網絡&#xff08;如互聯網&#xff09;建立安全連接的技術&#xff0c;使不同地理位置的局域網&#xff08;LAN&#xff09;能夠安…

JavaSE:開發環境的搭建(Eclipse)

一、IDE概述與核心價值 集成開發環境定義 提供編譯器、調試器、項目管理工具的統一平臺&#xff0c;顯著提升開發效率。 Eclipse核心優勢&#xff1a; 免費開源 &#xff1a;社區驅動&#xff0c;無授權費用跨平臺支持 &#xff1a;Windows/Linux/macOS全兼容多語言擴展 &a…

使用LLaMA-Factory對大模型進行微調

之前了解過一些LLM從訓練到落地的過程; 其中一個重要的步驟就是微調; 預訓練&#xff1a;在大規模數據上學習通用語言知識。(使用海量無標注文本&#xff08;TB級&#xff09;) 微調&#xff1a;在預訓練基礎上&#xff0c;使用特定任務的標注數據進一步優化模型。(使用少量任務…

WxPython——一些最常見的錯誤現象及解決方法

一些最常見的錯誤現象及解決方法 有一些錯誤它們可能會發生在你的wxPython應用程序對象或初始的頂級窗口在創建時&#xff0c;這些錯誤可能是很難診斷的。下面我們列出一些最常見的錯誤現象及解決方法&#xff1a; 錯誤現象&#xff1a;程序啟動時提示“unable to import modul…

SparkSQL 子查詢 IN/NOT IN 對 NULL 值的處理

SparkSQL 子查詢 IN/NOT IN 對 NULL 值的處理 官網&#xff1a;https://spark.apache.org/docs/4.0.0/sql-ref-functions.html https://spark.apache.org/docs/4.0.0/sql-ref-null-semantics.html#innot-in-subquery Unlike the EXISTS expression, IN expression can return…

【安卓筆記】lifecycle與viewModel

0. 環境&#xff1a; 電腦&#xff1a;Windows10 Android Studio: 2024.3.2 編程語言: Java Gradle version&#xff1a;8.11.1 Compile Sdk Version&#xff1a;35 Java 版本&#xff1a;Java11 1. 本篇文章涉及到的內容 lifecycle livedata databinding viewModel 2. …

84、逆向工程開發方法

逆向工程開發方法是一種通過分析現有產品、系統或代碼來理解其設計原理、功能實現及潛在缺陷&#xff0c;并在此基礎上進行改進、復制或創新的技術過程。它廣泛應用于軟件、硬件、機械、電子等多個領域&#xff0c;尤其在缺乏原始設計文檔或需要快速掌握復雜系統時具有顯著優勢…

ospf單區域實驗

拓撲圖&#xff1a;AR1&#xff1a;[Huawei]ospf 1 router-id 1.1.1.1 [Huawei-ospf-1]area 0[Huawei-ospf-1-area-0.0.0.0]network 192.168.1.0 0.0.0.255&#xff08;1.當前網段會被ospf的進程1學習到然后通告出去&#xff1b;2.如果接口的IP地址處于這個網段中&#xff0c…

Linux命令基礎完結篇

用戶權限修改 chmod修改文件權限 文字設定法 u&#xff1a;所有者g&#xff1a;所屬組o&#xff1a;其他人a&#xff1a;所有&#xff1a;添加權限-&#xff1a;刪除權限&#xff1a;賦予權限數字設定法 r&#xff1a;4w&#xff1a;2x&#xff1a;1每一組權限&#xff1a;0~7舉…

高效互聯,ModbusTCP轉EtherCAT網關賦能新能源電纜智能制造

在新能源汽車快速發展的背景下&#xff0c;新能源電纜作為關鍵組件&#xff0c;需滿足耐高低溫、阻燃、耐老化等嚴苛要求&#xff0c;這對生產線的工藝與設備提出了更高標準。為提升制造效率&#xff0c;某領先設備制造商創新采用**ModbusTCP轉EtherCAT網關**技術&#xff0c;實…

Java_多線程_生產者消費者模型_互斥鎖,阻塞隊列

生產者消費者模型(Producer-Consumer Model)是計算機科學中一個經典的并發編程模型&#xff0c;用于解決多線程/多進程環境下的協作問題。 基本概念 生產者&#xff1a;負責生成數據或任務的實體 消費者&#xff1a;負責處理數據或執行任務的實體 緩沖區&#xff1a;生產者與消…

Vue3實現視頻播放彈窗組件,支持全屏播放,音量控制,進度條自定義樣式,適配瀏覽器小窗播放,視頻大小自適配,緩沖loading,代碼復制即用

效果圖組件所需VUE3代碼<template><div class"video-dialog" :class"fullScreen && video-dialog-full-screen"><el-dialogv-model"props.visible"draggable:show-close"false"title""centeralign-c…

LLM層歸一化:γβ與均值方差的協同奧秘

LLM層歸一化參數均值和方差;縮放和平移參數是什么 層歸一化(Layer Normalization,LN)是深度學習中用于穩定神經網絡訓練的一種歸一化技術 均值和方差參數用于對輸入數據進行標準化處理,即將輸入數據轉換為均值為0、方差為1的標準正態分布 縮放因子γ\gammaγ:標準化后…

智慧場景:定制開發開源AI智能名片S2B2C商城小程序賦能零售新體驗

摘要&#xff1a;智慧場景作為零售行業創新發展的關鍵載體&#xff0c;正深刻改變著消費者的生活方式。本文聚焦智慧零售模式下智慧場景的構建&#xff0c;以定制開發開源AI智能名片S2B2C商城小程序為切入點&#xff0c;深入探討其在零售企業選址布局、商業模式創新、經營理念轉…

QML WorkerScript

WorkerScript是QML中實現多線程編程的關鍵組件&#xff0c;它允許開發者將耗時操作移至后臺線程執行&#xff0c;避免阻塞主UI線程&#xff0c;從而提升應用響應速度和用戶體驗。本文將全面介紹WorkerScript的核心機制、使用方法和最佳實踐。WorkerScript核心機制WorkerScript通…

銳浪報表 Grid++Report 表頭表尾的隱藏

設計銳浪表格的模板時&#xff0c;可以通過設計多個表頭、表尾&#xff0c;表頭、表尾中放入打印控件&#xff0c;可以打印相關的數據。在真實打印時&#xff0c;可以通過打印時讓表頭、表尾隱藏或顯示&#xff0c;實現用戶的表格樣式。一、表頭的指定1、 表頭可以多個&#xf…

低速信號設計之 QSPI 篇

一、引言? 在服務器技術不斷演進的當下,對高效、穩定的數據存儲和傳輸需求日益增長。QSPI(Quad Serial Peripheral Interface)總線作為一種高速、串行的外圍設備接口,在服務器領域中發揮著關鍵作用。它為服務器中的各類存儲設備及部分外圍芯片與主處理器之間提供了快速可…

別只知道暴力循環!我從用戶名校驗功能中領悟到的高效字符集判斷法(1684. 統計一致字符串的數目)

別只知道暴力循環&#xff01;我從用戶名校驗功能中領悟到的高效字符集判斷法 &#x1f60e; 大家好&#xff0c;日常開發中&#xff0c;我們經常會遇到一些看似不起眼&#xff0c;卻能成為性能瓶頸的小模塊。今天&#xff0c;我想和大家分享一個我親身經歷的故事&#xff0c;…