垃圾收集器-ZGC

前言

在Java開發中,垃圾收集器的選擇對系統性能有著致命的影響。Java 8后,雖然G1 GC成為默認,但是它在延遲性控制上仍有限。ZGC作為最新一代高性能低延遲垃圾收集器,解決了CMS和G1在延遲、垃圾堆容量和吞吐量方面的重大突破。本文將完整給出ZGC的技術原理和實際應用,幫助您做出最適合應用場景的GC選型。


Java中的垃圾收集概述

垃圾收集的意義

Java采用自動內存管理(GC),幫助開發者自動處理不再使用的對象內存。GC的目標是在盡量減少延遲的同時,回收無用對象,維持系統的穩定運行和內存調度。

當前垃圾收集系統培勝于 "根集" 分析,根集為程序可達對象的集合,GC進行探游,找出可達對象,其余則可以處理成垃圾。

Java堆內存分區

Java堆內存通常分為兩大區域:

  • Young Generation (年輕代):新生成的對象,較簡單。內部分為Eden和Survivor S0/S1。

  • Old Generation (老年代):清除盡Young GC后仍然存活的對象,常應用于Full GC。

有些GC器同時使用總緩存(Metaspace)、堆外內存區域、選擇性老年代等特殊區域。


Java垃圾收集器的演進

在深入了解ZGC之前,我們需要先回顧Java中垃圾收集器的發展歷程,特別是ZGC推出之前在Java 8及更早版本中常見的幾種GC方式。這不僅幫助我們理解ZGC為何而生,也為我們提供比較其優劣的視角。

Java 8中的主要垃圾收集器

Java 8中默認的垃圾收集器是Parallel GC,但在很多中大型項目中,開發者常常會根據不同的業務需求切換為CMS(Concurrent Mark-Sweep)或者G1(Garbage First)。下面我們來分別了解這些GC方式的基本特點與運行機制。

1. Serial GC

適用于單核處理器或者內存較小的客戶端應用。

  • 特點:串行執行,GC過程中STW(Stop-The-World)時間較長。

  • 優點:實現簡單,適用于內存小、線程少的環境。

  • 缺點:不適合服務器端或多線程環境。

// 啟用Serial GC
java -XX:+UseSerialGC -Xms512m -Xmx512m MyApp
2. Parallel GC(吞吐量優先GC)

也稱為吞吐量GC,追求最大程度的吞吐量,適用于批處理和計算密集型任務。

  • 特點:多個GC線程并行執行,仍會發生Stop-The-World。

  • 優點:高吞吐、GC時間相對較短。

  • 缺點:GC期間程序線程全部暫停。

// 啟用Parallel GC
java -XX:+UseParallelGC -Xms1g -Xmx1g MyApp
3. CMS GC(并發標記清除)

目標是減少GC對程序運行的影響,引入并發階段。

  • 特點:多階段GC流程,包括初始標記、并發標記、重新標記、并發清除。

  • 優點:在標記和清除階段大部分操作可并發,適合響應時間敏感型應用。

  • 缺點:內存碎片化嚴重,標記過程復雜。

// 啟用CMS GC
java -XX:+UseConcMarkSweepGC -Xms2g -Xmx2g MyApp
4. G1 GC(Garbage First)

G1是在Java 8中被引入并逐漸替代CMS的收集器,強調可預測的停頓時間

  • 特點:堆被分成多個小區域(Region),混合收集老年代和年輕代。

  • 優點:減少Full GC頻率,支持大內存,延遲控制能力較CMS強。

  • 缺點:在低延遲場景仍有不可預測的長時間停頓。

// 啟用G1 GC
java -XX:+UseG1GC -Xms4g -Xmx4g MyApp

各GC對比總結

GC 類型并發能力停頓時間吞吐量內存使用效率是否碎片整理
Serial
Parallel中等
CMS低(有碎片)
G1中到低

從上表中可以看出,雖然CMS和G1 GC在延遲方面取得了一定進展,但仍存在以下痛點:

  1. Full GC影響嚴重:尤其是在老年代清理時,仍需STW,造成業務請求中斷。

  2. 大堆內存支持不佳:CMS在大堆場景(數十GB以上)容易產生碎片,甚至OOM。

  3. 標記和清理效率有限:并發過程開銷大,回收速度不夠理想。

因此,為了進一步降低延遲、提升大內存環境下的GC性能,ZGC應運而生,尤其在Java 11之后成為低延遲場景的新寵。


ZGC概述

ZGC(Z Garbage Collector)是Java平臺自Java 11起引入的一種可擴展、低延遲、并發型垃圾收集器,旨在為大堆內存場景下的Java應用提供極低的GC暫停時間(最大不超過10ms),同時保持高吞吐量。

在ZGC出現前,雖然G1 GC已實現了對延遲控制的初步優化,但在某些實時性要求極高的系統中(如金融撮合引擎、大型電商、在線游戲服務器等),它仍然無法完全滿足毫秒級停頓時間的需求。ZGC正是為此類場景設計。

核心目標

ZGC的主要設計目標如下:

  • 暫停時間不超過10ms(與堆大小無關)

  • 支持超大堆內存(最大支持16TB)

  • 并發回收、并發壓縮

  • 低吞吐量損失

  • 低內存碎片率

這些特性使得ZGC非常適用于以下應用場景:

  • 低延遲應用(例如在線交易系統)

  • 大型數據處理(大內存服務端)

  • 響應時間敏感的分布式系統

Java版本支持情況

ZGC最早以實驗性功能形式在JDK 11中引入,之后不斷發展完善:

Java 版本狀態啟用方式
JDK 11實驗性-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
JDK 15正式支持-XX:+UseZGC
JDK 17長期支持(LTS)-XX:+UseZGC
JDK 21引入Generational ZGC-XX:+UseZGC(自動使用代際ZGC)

注意:ZGC不支持Java 8。在JDK 8中,建議使用G1 GC作為替代方案來控制延遲,但G1在最小停頓時間方面遠不如ZGC。

如何啟用ZGC

在JDK 11中啟用ZGC需顯式解鎖實驗性選項:

java \-XX:+UnlockExperimentalVMOptions \-XX:+UseZGC \-Xmx8g \-Xms8g \-jar myapp.jar

從JDK 15起,ZGC已成為正式功能,無需再解鎖實驗性選項:

java \-XX:+UseZGC \-Xmx16g \-Xms16g \-jar myapp.jar

建議在中大型內存(如4GB以上)下使用ZGC以體現其優勢。

ZGC命名的由來

ZGC中的"Z"并沒有官方明確解釋,但社區中普遍認為其含義為:

  • Zero Pause GC(零停頓GC)

  • 或者表示最終GC的終極目標(The last GC you'll ever need)


ZGC架構深度分析

ZGC之所以能夠實現低于10ms的暫停時間,離不開其創新性的內部架構設計。ZGC徹底顛覆了以往垃圾收集器在內存布局和對象訪問上的方式,采用以下關鍵技術:

  • 區域化堆(Region-based Heap)

  • 彩色指針(Colored Pointers)

  • 加載屏障(Load Barriers)

  • 并發回收機制

本節將逐一詳細講解這些核心模塊。本部分為第一部分,重點解析:

1. 區域化堆(Region-based Heap)

傳統GC如CMS和Parallel GC使用固定大小的堆區域分代(如Eden區、Survivor區、Old區),但ZGC則摒棄了這種固定代分區方式,采用區域化(Region-based)堆布局

ZGC的堆被動態劃分成一塊塊的邏輯小區域(region),每個區域最小為2MB,最大可以根據配置擴展。這些區域根據用途被分類如下:

  • Small Object Space:存儲小對象,一般小于256KB。

  • Large Object Space:存儲大對象,單個對象跨多個區域。

  • Remapped Space:用于搬遷中的對象區域(relocation)。

ZGC的region是非連續、非固定映射的,具有以下優勢:

  • 堆可動態增長和收縮,極大提升內存使用彈性。

  • 對不同區域類型可采用不同的壓縮或回收策略。

  • 支持并發搬遷與并發壓縮,減少碎片和延遲。

示例:

// 模擬大對象分配時,ZGC自動從 Large Object Space 中分配區域
byte[] largeArray = new byte[10 * 1024 * 1024]; // 10MB 數組

ZGC可快速在Large Object Space中定位空閑Region,支持高并發申請。

2. 彩色指針(Colored Pointers)

ZGC使用的一項革命性技術是彩色指針,即將對象引用的高位用于標記GC狀態信息。這種做法打破了傳統將引用與元數據分離的限制。

ZGC的對象指針是64位,但由于現代操作系統通常只用低48位尋址,ZGC利用高位中的幾位嵌入顏色信息:

位段含義
0-47實際地址
48Finalizable標記位
49Remapped標記位
50Marked標記位
51Load Barrier位

通過這種設計,ZGC可以在訪問對象指針的瞬間就獲知其GC狀態,而無需查找外部元數據結構,大大提升了并發訪問的性能。

優點包括:

  • 減少GC元信息結構依賴

  • 提升GC期間并發可達性分析速度

  • 降低堆碎片率和對象搬遷時的同步成本

示例說明:

Object ref = obj; // ref 實際上是帶顏色標記的指針

開發者無需干預,ZGC自動對這些指針做屏障處理和位標記解碼。

3. 加載屏障(Load Barrier)

**加載屏障(Load Barrier)**是ZGC最獨特的技術之一。它在每次訪問Java對象引用時自動觸發,用于處理對象在搬遷過程中的一致性問題。

加載屏障的主要職責是:

  • 判斷引用對象是否已被搬遷(relocated)

  • 如果是,執行指針修復(pointer remapping)

  • 保證所有線程訪問到的是最新的對象地址

ZGC加載屏障是在JVM層面插入的,對開發者完全透明,不需要修改應用代碼。其實現通常依賴CPU原語(如內存屏障)結合內聯匯編,實現高效的指針判斷與更新。

加載屏障的邏輯類似如下偽代碼:

Object ref = load(o);
if (ref has relocation flag) {ref = remap(ref);
}
return ref;

優勢

  • 極低延遲:加載屏障可與普通對象訪問融合,不增加明顯開銷

  • 并發友好:允許對象在不暫停應用線程的前提下完成搬遷

  • 精確控制:每次讀取都能精準判斷是否需要修復

真實案例場景

List<Person> people = ...;
for (Person p : people) {// 訪問 p.getName() 時會觸發 Load Barrier 檢查其對象是否已搬遷System.out.println(p.getName());
}

即使此時ZGC正在并發地搬遷 Person 對象,也不會阻塞當前線程讀取。

4. 并發回收機制

ZGC之所以能將GC暫停控制在10ms以內,根本在于其極致的并發垃圾回收機制。它幾乎將所有GC階段轉為并發執行,避免了傳統GC中長時間的"Stop-The-World"。

ZGC的垃圾回收周期包含如下階段:

階段是否并發描述
初始標記(Pause Mark Start)極短暫停,標記GC Root
并發標記(Concurrent Mark)并發遍歷整個堆,標記存活對象
并發重定位準備(Concurrent Prepare Relocate)選擇要搬遷的對象
暫停重定位開始(Pause Relocate Start)短暫停,開啟重定位
并發搬遷(Concurrent Relocate)將活躍對象搬遷至新區域
并發重映射(Concurrent Remap)更新所有引用為新地址(結合Load Barrier)

其中,兩個短暫停階段(初始標記與重定位開始)通常耗時都小于2ms。

ZGC的設計核心是將搬遷(對象復制)也并發完成,這在傳統GC中幾乎是不可想象的。

示例流程圖(文字描述)

  1. GC線程開始并發標記階段,與應用線程并行運行。

  2. 找到垃圾對象集合后,選擇部分區域進行回收。

  3. 搬遷對象至新區域,由多個線程協作完成,應用線程繼續運行。

  4. 通過加載屏障和指針重映射,確保應用訪問到的是新地址。

這種模式極大減少了STW(Stop-The-World)對應用性能的影響。

優勢總結

  • 幾乎全程并發執行

  • 極低暫停時間(<10ms)

  • 支持TB級堆空間的低延遲回收

  • 精細控制搬遷單元,避免大塊復制阻塞


ZGC工作原理

ZGC的基本目標是在實現大內存空間支持下,并俗降低GC暫停時間,盡量將GC各階段轉為并發執行。下面將以ZGC一次完整GC周期為線程,分段解析其工作流程:

1. GC觸發

ZGC與其他GC一樣,通過內存占用分析來觸發GC。其GC觸發可能原因包括:

  • 內存占用超過閥值

  • 對象分配失敗

  • 手動調用 System.gc()

在GC觸發后,ZGC進入一次完整的GC周期。

2. 初始標記 (Pause Mark Start)

這是ZGC兩個短暫停階段之一,將GC Root(如程序棧、靜態對象、JNI指針) 加入標記集合。

特點:

  • 更新系統中所有根引用

  • 更新開始標記的標志位(帶有顏色的指針)

  • 優化後通常耗時<1ms

3. 并發標記 (Concurrent Mark)

將基于標記集合的引用給所有可達對象進行并發添加。此階段與應用程序同時運行,不需要暫停。

內部機制:

  • 利用帶顏色指針判定對象是否已標記

  • 培子線程分布標記任務,支持核心級并發

  • 并行識別、合并圖結構

// 類似于每個對象被標記為活躍時,就會追蹤其引用
if (!isMarked(obj)) {mark(obj);for (Object ref : obj.getReferences()) {mark(ref);}
}

4. 并發轉移準備 (Concurrent Prepare Relocate)

此階段分析哪些Region需要轉移,通常選擇廢物比例高的Region,盡量減少拷貝量,提高性能。

  • 標記結束后,定義要移動的Region集合

  • 與應用程序并行

5. 移動開始暫停 (Pause Relocate Start)

為了保證移動階段的一致性,需要簡短地暫停一下,切換GC狀態,啟用轉移。

  • 暫停平均耗時也很短(<2ms)

  • 進行新的Region空間創建

6. 并發對象移動 (Concurrent Relocate)

ZGC使用并發線程將活躍對象轉移到新的Region。這些操作與應用程序同時進行,合作Load Barrier確保引用不算錯。

// Load Barrier檢測到指針已移動
if (isForwarded(ptr)) {ptr = loadForwardingPointer(ptr); // 修復指針
}

7. 并發重映 (Concurrent Remap)

在應用運行過程中,某些指針可能還未被修復,此階段將通過并發線程把還未被更新的指針重新映射。

  • 重映是指針修復的最后階段

  • 確保所有引用指向正確對象

8. GC結束

當所有移動完成、指針已更新后,GC周期結束,釋放被固定重映的老Region,新Region補入。


ZGC與Java 8中垃圾收集器的對比

在Java 8中,常用的幾種垃圾收集器包括Serial GC、Parallel GC、CMS(Concurrent Mark-Sweep)以及G1(Garbage First)GC。這些收集器在當時各有優劣,而ZGC自Java 11引入后,徹底改變了GC在延遲敏感場景下的表現。本節將ZGC與Java 8時代代表性的垃圾收集器——G1、CMS等進行對比,從多個維度全面展示ZGC的優勢與局限。

1. 暫停時間對比

收集器暫停類型最佳暫停時間典型暫停時間最差暫停時間
SerialStop-the-World10ms - 數百ms數十ms - 秒級秒級
ParallelStop-the-World數十ms數百ms數秒
CMS并發標記 + STW幾十ms數百ms可能超過1s(碎片整理)
G1分區化,部分并發低于200ms(可設定)50ms - 200ms秒級(Full GC)
ZGC幾乎全并發<1ms<10ms通常不超過10ms

ZGC的暫停時間控制極其優秀,甚至在TB級堆上依然穩定控制在10ms以內。

2. 吞吐量與堆規模支持

收集器最大支持堆大小吞吐能力
Serial小于8GB較低
Parallel幾十GB
CMS通常推薦<100GB中高
G1理論上可到數百GB中高(根據Region粒度變化)
ZGC實際支持高達數TB高(并發、分層)

ZGC特別適用于超大堆應用,如大數據平臺、實時分析引擎、AI在線推理服務等。

3. 并發能力

收集器并發標記并發清理/壓縮對應用線程干擾
Serial
Parallel
CMS部分并發
G1否(壓縮是STW)
ZGC是(全階段并發)極低

ZGC是真正意義上"全階段并發"的垃圾收集器,大幅減小GC對響應時間的干擾。

4. 內存碎片處理

  • CMS 是非壓縮的,容易出現內存碎片,導致分配失敗。

  • G1 雖然分區化,但壓縮仍需STW,內存整理成本高。

  • ZGC 利用并發搬遷機制,可以在線完成對象壓縮,極少碎片產生。

// G1碎片整理常常需要Stop-the-World:
-XX:+UseG1GC
-XX:+G1HeapRegionSize=8m
// 遇到Old區不足可能引發 Full GC 暫停

5. 部署與兼容性

收集器Java版本支持啟用方式
CMSJava 8 - Java 14(后移除)-XX:+UseConcMarkSweepGC
G1Java 7+默認GC(Java 9+)
ZGCJava 11+(JDK 15轉為生產)
-XX:+UnlockExperimentalVMOptions
-XX:+UseZGC
``` |ZGC從JDK 15起被標記為生產可用,推薦用于延遲敏感、堆空間巨大的現代系統。### 6. 代碼透明度與可維護性ZGC對開發者完全透明,不需要特殊編碼配合,不影響業務邏輯。```java
public class User {private String name;private Address address;
}// 正常使用,不需要關注GC過程:
User u = new User();
u.setName("張三");

相比之下,CMS可能因碎片化或過時參數帶來配置難度,而G1對GC參數的調優要求較高。


總結:為何選ZGC?

ZGC在以下場景中極具優勢:

  • 低延遲要求:如金融交易撮合系統、在線推薦、游戲服務端

  • 大內存平臺:如TB級堆數據倉庫、機器學習推理服務、海量會話保持

  • 高并發業務:如大型API網關、消息中間件

同時,ZGC的易用性(代碼透明、自動壓縮、穩定暫停時間)也大大降低了運維與開發門檻,是Java未來GC的核心發展方向之一。


ZGC性能調優指南

ZGC雖然擁有優秀的默認性能表現,但在特定業務場景中,通過合理調優可以進一步提升其效率,降低資源占用,增強服務穩定性。本節將圍繞ZGC的參數設置、性能監控、常見問題應對策略進行系統講解。

一、ZGC啟用與基礎配置

ZGC需Java 11及以上版本支持,啟用ZGC基本參數如下:

# 啟用ZGC(Java 11中仍為實驗特性)
-XX:+UnlockExperimentalVMOptions
-XX:+UseZGC# 示例:設置最大堆、初始堆大小
-Xmx16g
-Xms16g

在JDK 15及以上版本,無需再解鎖實驗選項,可直接使用 -XX:+UseZGC

二、核心調優參數解析

1. 堆空間設置

ZGC不像G1那樣依賴分區大小調優,它的核心是Region自動管理。因此主要關注以下兩個參數:

-Xmx16g   # 最大堆內存
-Xms16g   # 初始堆內存

建議:ZGC在大堆(如>8G)下性能更優,最好將 -Xmx 與 -Xms 設為相同,避免運行時堆調整。

2. GC線程數控制
-XX:ConcGCThreads=N       # 控制并發GC線程數量
-XX:ParallelGCThreads=N   # 初始標記和對象拷貝時的并行線程數

ZGC自動選擇線程數,但在高并發系統中,如需控制資源消耗可手動設定。

3. 啟用 NUMA 感知(多核性能優化)
-XX:+UseNUMA

在多Socket架構服務器上建議啟用,提升跨節點堆訪問性能。

4. 禁用透明大頁(降低TLB抖動)
-XX:+UseTransparentHugePages=false

可避免ZGC在大型對象分配中引發頻繁頁表轉換開銷。

三、ZGC特有診斷與追蹤參數

ZGC支持詳細的垃圾回收日志輸出,有助于觀察其行為與性能:

-Xlog:gc*,safepoint:file=gc.log:time,uptime,level,tags

樣例輸出:

[2.344s][info][gc,start] GC(0) Pause Mark Start
[2.344s][info][gc] GC(0) Pause Mark Start 0.415ms
[2.345s][info][gc,start] GC(0) Concurrent Mark
[2.567s][info][gc] GC(0) Concurrent Mark 222.187ms
...

通過這些日志,可判斷暫停時間是否穩定,GC是否頻繁觸發等信息。

四、常見調優策略

場景調優建議
吞吐不足提升GC線程數,增加CPU核心數
GC頻繁檢查內存是否足夠,提升 -Xmx 值
暫停波動大檢查是否開啟了大頁,是否存在頻繁Full GC
CPU占用高適當限制 GC 并發線程數
堆未滿就GC檢查是否被顯式調用 System.gc(),避免誤觸發

五、結合容器環境的參數配置建議

在Kubernetes、Docker等容器中運行時,應注意:

-XX:+UseContainerSupport   # 啟用容器資源感知(JDK 10+ 默認開啟)
-XX:MaxRAMPercentage=80.0  # 最大可用內存占比(替代傳統的 -Xmx)

這樣可確保ZGC在容器內合理管理資源,不會溢出宿主機。

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

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

相關文章

計算機“十萬個為什么”之跨域

計算機“十萬個為什么”之跨域 本文是計算機“十萬個為什么”系列的第五篇&#xff0c;主要是介紹跨域的相關知識。 作者&#xff1a;無限大 推薦閱讀時間&#xff1a;10 分鐘 一、引言&#xff1a;為什么會有跨域這個“攔路虎”&#xff1f; 想象你正在參觀一座戒備森嚴的城堡…

C語言:20250719筆記

字符數組在C語言中&#xff0c;支持字符串常量&#xff0c;不支持字符串變量。如果想要實現類似的字符串變量&#xff0c;C語言提供了兩種實現方式&#xff1a;字符數組&#xff1a;char name[] “哪吒”&#xff1b;字符指針&#xff1a;char *name "娜吒"&#x…

decltype是什么,什么作用?

基本概念decltype 是 C11 引入的關鍵字&#xff0c;用于推導表達式的類型&#xff0c;且會完整保留類型的細節&#xff08;包括 const、引用 &、指針 * 等&#xff09;。語法:decltype(表達式) 變量名核心特點1.推導依據是表達式本身&#xff0c;而非表達式的結果&#xff…

RPC 與 Feign 的區別筆記

一、基本概念 1.1 RPC&#xff08;Remote Procedure Call&#xff09; 定義&#xff1a;遠程過程調用&#xff0c;允許像調用本地方法一樣調用遠程服務的方法。 本質&#xff1a;跨進程通信&#xff0c;隱藏了底層網絡通信的復雜性。 常見實現&#xff1a; Java 原生 RMIDub…

高防IP能夠防御CC攻擊嗎?它具備哪些顯著優勢?

摘要&#xff1a; 面對日益復雜的網絡攻擊&#xff0c;高防IP作為重要的安全工具&#xff0c;不僅能防御常見的DDoS攻擊&#xff0c;還能有效應對CC攻擊。本文將解析高防IP防御CC攻擊的原理及其核心優勢&#xff0c;幫助讀者了解其在網絡安全中的關鍵作用。一、高防IP能否防御C…

TypeScript 類型注解(一)

一、TypeScript 類型注解1、什么是TpyeScript類型注解- 是否還記得TypeScript的兩個重要特性&#xff1f;- 類型系統、適用于任何規模- 可以說&#xff0c;TS的類型系統是TS最重要的功能&#xff1b;那么什么是類型注解呢&#xff1f;其實就是在聲明變量時&#xff0c;將變量的…

弗蘭肯斯坦式的人工智能與GTM策略的崩潰

2025 年上半年已經明確了一件事&#xff1a;B2B 市場營銷團隊被工具淹沒&#xff0c;但缺乏策略。人工智能無處不在。收入領導者在進行無休止的試點。營銷團隊拼湊各種點解決方案&#xff0c;希望能實現規模擴張。然而&#xff0c;銷售線索的增長停滯不前。信譽正在受損。曾經承…

NAND閃存(NAND Flash)是什么?

NAND閃存(NAND Flash)是什么? NAND閃存(NAND Flash)詳解 NAND閃存是一種非易失性存儲介質(斷電不丟失數據),廣泛應用于SSD、U盤、手機存儲等設備中。NAND Flash 的全稱是 “Negative-AND Flash”(與非型閃存),其名稱源自其底層存儲單元的電路結構——基于**“與非門…

Android性能優化之UI渲染優化

一、UI渲染核心瓶頸深度解析 1. 渲染管線關鍵階段階段CPU工作GPU工作潛在卡頓點Measure計算View尺寸-嵌套布局多次測量Layout計算View位置-頻繁重排(Relayout)Draw構建DisplayList指令集-復雜自定義View.onDraw()Sync & Upload資源上傳到GPU內存紋理上傳大圖/未壓縮資源Ras…

基于Spring AI Alibaba的智能知識助手系統:從零到一的RAG實戰開發

&#x1f4d6; 項目概述 在人工智能快速發展的今天&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;技術已成為構建智能問答系統的核心技術。本文將詳細介紹一個基于Spring AI Alibaba DashScope深度集成的智能知識助手系統的完整開發過程&#xff0c;…

VirtualBox + CentOS:啟用 DHCP 獲取 IPv4 地址

標題&#xff1a; VirtualBox CentOS&#xff1a;啟用 DHCP 獲取 IPv4 地址 日期&#xff1a; 2025-07-18 一、問題現象 最小化安裝的 CentOS 7 虛擬機里敲&#xff1a; ip addr輸出只有 lo 的 127.0.0.1 以及 enp0s3 的 IPv6 鏈路本地地址&#xff0c;沒有 IPv4&#xff0…

Git

Git簡介Git 是一個分布式版本控制工具&#xff0c;通常用來對軟件開發過程中的源代碼文件進行管理。通過Git 倉庫來存儲和管理這些文件&#xff0c;Git 倉庫分為兩種:本地倉庫:開發人員自己電腦上的 Git倉庫。遠程倉庫:遠程服務器上的 Git 倉庫。commit: 提交, 將本地文件和版本…

通信算法之294:LTE系統中的整數倍頻偏估計

在LTE系統中&#xff0c;整數倍頻偏估計主要通過以下方法實現&#xff1a;一、最大似然估計法&#xff08;ML&#xff09;通過遍歷預設的整數倍頻偏范圍&#xff08;如30kHz&#xff09;&#xff0c;將接收信號與本地的PSS序列在不同頻偏點上進行相關運算&#xff0c;選擇相關峰…

數字人直播:開啟直播行業新紀元?

?原始尺寸更換圖片p9-flow-imagex-sign.byteimg.com??在科技日新月異的當下&#xff0c;直播行業正經歷著一場深刻變革&#xff0c;數字人直播的興起&#xff0c;宛如一顆璀璨新星&#xff0c;照亮了直播領域的新征程。數字人直播&#xff0c;是利用先進的人工智能技術&…

朝鮮升級供應鏈惡意軟件XORIndex,再次瞄準npm生態系統

Socket威脅研究團隊最新披露&#xff0c;朝鮮國家支持的黑客組織在"傳染性面試"攻擊活動中采用了新型惡意軟件加載器XORIndex&#xff0c;該惡意程序專門通過npm軟件包注冊表滲透軟件供應鏈。攻擊規模與持續性此次攻擊并非孤立事件&#xff0c;而是針對開發者、求職者…

Windows 下 VS2019 編譯 libevent-2.1.10 庫

1. 你需要VS2019 編譯好openssl-1.1.1 &#xff0c;這個具體編譯或者下載可以參考我的博客openssl生成的庫是這兩個文件接下來&#xff0c;打開CMake &#xff0c;主要是下面的需要設置好最后Config Generate即可&#xff1b;全部成功生成 22個然后INSTALL右鍵生成 最后看下生…

Vim多列操作指南

我們在使用 Vim 時&#xff0c;經常需要同時編輯多個文件&#xff0c;或者同一個文件的不同部分。Vim 提供了分割窗口&#xff08;split&#xff09;和垂直分割窗口&#xff08;vsplit&#xff09;的功能&#xff0c;允許我們在同一個 Vim 會話中查看多個緩沖區&#xff08;buf…

Python網絡爬蟲實現selenium對百度識圖二次開發以及批量保存Excel

一.百度識圖自動上傳圖片from selenium import webdriver from selenium.webdriver.edge.options import Options from selenium.webdriver.common.by import By edge_options Options() edge_options.binary_location r"C:\Program Files (x86)\Microsoft\Edge\Applica…

Vue中的refs字段使用記錄

這段代碼是 Vue.js 中結合 Element UI 等 UI 庫的典型表單驗證寫法&#xff0c;具體含義如下&#xff1a;代碼拆解 this.$refs.fromData.validate((valid) > {// 驗證后的回調邏輯 })this.$refs.fromData $refs 是 Vue 提供的特殊屬性&#xff0c;用于訪問模板中通過 ref&qu…

多方案對比分析:后端數據加密策略及實踐

多方案對比分析&#xff1a;后端數據加密策略及實踐 隨著互聯網業務對用戶隱私和數據安全的要求不斷提升&#xff0c;后端系統中對敏感數據的加密保護已成為必備需求。從對稱加密、非對稱加密到數據庫透明加密、應用層字段加密&#xff0c;各種方案各有特點。本文將以方案對比分…