java-JVM詳解

一、JVM 是什么?

定義
JVM(Java Virtual Machine)是一個虛擬計算機,為 Java 字節碼提供運行環境。它是 Java “一次編寫,到處運行”(Write Once, Run Anywhere)的核心基礎,通過屏蔽底層操作系統差異實現跨平臺能力。


二、JVM 的核心作用

  1. 跨平臺執行
    • .java 文件編譯為與平臺無關的字節碼.class 文件),由 JVM 解釋/編譯為機器碼執行。
  2. 內存管理
    • 自動分配與回收內存(堆、棧等),避免手動管理內存導致的泄露或溢出。
  3. 代碼安全
    • 字節碼驗證器(Verifier)確保代碼符合 JVM 規范,防止惡意代碼執行。
  4. 運行時優化
    • 即時編譯器(JIT)將熱點代碼編譯為本地機器碼,提升執行效率。

三、JVM 的架構組成

JVM Architecture
類加載子系統
運行時數據區
執行引擎
本地方法接口
本地方法庫
方法區
JVM棧
本地方法棧
程序計數器
解釋器
JIT編譯器
垃圾回收器
1. 類加載子系統(Class Loader Subsystem)
  • 作用:加載 .class 文件到內存,生成 Class 對象。
  • 加載流程
    1. 加載(Loading):查找字節碼并載入內存。
    2. 鏈接(Linking)
      • 驗證(Verification):確保字節碼合法。
      • 準備(Preparation):為靜態變量分配內存并賦默認值(如 int0)。
      • 解析(Resolution):將符號引用轉為直接引用。
    3. 初始化(Initialization):執行靜態代碼塊和靜態變量賦值。
2. 運行時數據區(Runtime Data Areas)
區域作用線程安全
堆(Heap)存儲對象實例和數組(GC 主戰場)共享
方法區(Method Area)存儲類信息、常量池、靜態變量(JDK8+ 由元空間 Metaspace 實現)共享
JVM 棧(Stack)存儲棧幀(局部變量表、操作數棧、動態鏈接、方法出口)線程私有
本地方法棧支持 Native 方法(如 C/C++ 代碼)線程私有
程序計數器記錄當前線程執行的字節碼位置(唯一不會 OOM 的區域)線程私有
3. 執行引擎(Execution Engine)
  • 解釋器(Interpreter):逐行解釋執行字節碼(啟動快,執行慢)。
  • JIT 編譯器(Just-In-Time Compiler)
    • 熱點代碼(頻繁執行的方法)編譯為本地機器碼(執行快)。
    • 優化策略:方法內聯(Inlining)、逃逸分析(Escape Analysis)。
  • 垃圾回收器(GC):自動回收堆中無用對象(詳見下文)。
4. 本地方法接口(JNI)
  • 提供調用操作系統本地方法(如 native 修飾的方法)的能力。

四、JVM 內存管理詳解

1. 堆內存結構
新生代 (Young Generation)      老年代 (Old Generation)
├── Eden(80%)              └── 存放長期存活對象
├── Survivor 0 (S0, 10%)
└── Survivor 1 (S1, 10%)
  • 對象分配流程
    1. 新對象優先分配在 Eden 區
    2. Eden 滿時觸發 Minor GC,存活對象移到 Survivor 區(S0/S1)。
    3. 對象在 Survivor 區每熬過一次 GC,年齡 +1。
    4. 年齡達到閾值(默認 15)時晉升到老年代
    5. 老年代空間不足時觸發 Full GC(STW 時間長)。
2. 垃圾回收算法
算法原理優缺點
標記-清除標記存活對象 → 清除未標記對象簡單,但產生內存碎片
復制將存活對象復制到另一塊內存 → 清空原區域無碎片,但浪費 50% 空間
標記-整理標記存活對象 → 向一端移動 → 清理邊界外內存無碎片,適合老年代
分代收集新生代用復制算法,老年代用標記-清除/整理綜合效率最優(商用 JVM 默認)
3. 垃圾收集器對比
收集器區域算法特點
Serial新生代復制單線程,STW 時間長
Parallel Scavenge新生代復制多線程,吞吐量優先
CMS老年代標記-清除并發收集,低延遲(JDK9 廢棄)
G1全堆分區 + 標記-整理可預測停頓(JDK9+ 默認)
ZGC全堆染色指針亞毫秒級停頓(JDK15+ 生產可用)

五、JVM 執行引擎工作流程

Java 源碼字節碼(.class)JVM 執行引擎操作系統javac 編譯類加載子系統加載解釋器逐行解釋執行JIT 編譯器優化編譯loop[熱點代碼檢測-]執行本地機器碼Java 源碼字節碼(.class)JVM 執行引擎操作系統
關鍵步驟:
  1. 解釋執行:初始階段由解釋器執行字節碼。
  2. 熱點探測:計數器統計方法調用次數/循環執行次數。
  3. JIT 編譯:將熱點代碼編譯為本地機器碼(存入 Code Cache)。
  4. 執行優化代碼:后續直接執行編譯后的機器碼。

六、JVM 的跨平臺實現原理

javac
.java 源碼
.class 字節碼
JVM for Windows
JVM for Linux
JVM for Mac
ARM64 機器碼
  • 關鍵設計
    • 字節碼是介于 Java 源碼和機器碼之間的中間表示。
    • 各平臺提供專屬 JVM 實現,負責將字節碼翻譯為本地指令。

七、實戰:JVM 參數調優示例

1. 堆內存配置
# 設置初始堆大小 1G,最大堆大小 2G
java -Xms1g -Xmx2g -jar app.jar
2. 選擇垃圾收集器
# 使用 G1 收集器,目標停頓 200ms
java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar app.jar
3. 內存溢出時生成 Dump
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/dump.hprof -jar app.jar

八、常見問題排查工具

工具作用
jps查看 Java 進程 PID
jstat監控堆內存和 GC 情況(如 jstat -gcutil PID
jmap生成堆轉儲文件(Heap Dump)
jstack導出線程棧信息(排查死鎖)
VisualVM圖形化監控 JVM 狀態

總結:JVM 的核心價值

  1. 跨平臺:字節碼 + 平臺專屬 JVM 實現跨操作系統。
  2. 內存安全:自動內存管理避免手動操作錯誤。
  3. 性能優化:JIT 編譯使 Java 接近原生性能。
  4. 生態基石:支撐 Java/Kotlin/Scala 等 JVM 語言生態。

一、JVM本質與核心作用

1.1 JVM是什么?

JVM是一個抽象的計算機器,它通過軟件模擬硬件功能,為Java字節碼提供執行環境。其核心價值在于:

  • 跨平臺性:通過"一次編譯,到處運行"解決平臺兼容問題
  • 內存管理:自動內存分配與垃圾回收
  • 安全沙箱:字節碼驗證和安全機制防止惡意代碼
  • 性能優化:JIT編譯提升執行效率

1.2 JVM核心架構全景圖

┌───────────────────────────────┐
│          Java應用程序          │
└──────────────┬────────────────┘│
┌──────────────▼────────────────┐
│          Class文件             │
└──────────────┬────────────────┘│
┌──────────────▼────────────────┐
│      類加載子系統 (ClassLoader)  │
├───────────────────────────────┤
│ 1. 加載 → 2. 鏈接 → 3. 初始化    │
└──────────────┬────────────────┘│
┌──────────────▼────────────────┐
│       運行時數據區 (Runtime Data Areas) │
├───────────────────────────────┤
│ ? 方法區      ? 堆              │
│ ? JVM棧      ? 本地方法棧       │
│ ? 程序計數器                   │
└──────────────┬────────────────┘│
┌──────────────▼────────────────┐
│        執行引擎 (Execution Engine) │
├───────────────────────────────┤
│ ? 解釋器                      │
│ ? JIT編譯器                   │
│ ? 垃圾回收器                   │
└──────────────┬────────────────┘│
┌──────────────▼────────────────┐
│        本地方法接口 (JNI)        │
└──────────────┬────────────────┘│
┌──────────────▼────────────────┐
│        本地方法庫 (Native Libraries)│
└───────────────────────────────┘

二、類加載機制深度剖析

2.1 類加載完整流程

加載 Loading
驗證 Verification
準備 Preparation
解析 Resolution
初始化 Initialization
2.1.1 加載階段
  • 二進制流來源
    • 本地文件系統
    • JAR/WAR包
    • 網絡資源
    • 運行時生成(動態代理)
    • 數據庫
  • 核心任務
    • 生成方法區類型數據結構
    • 創建對應Class對象(堆中)
2.1.2 鏈接階段
  • 驗證(四階段驗證):

    1. 文件格式驗證:魔數0xCAFEBABE
    2. 元數據驗證:語義分析
    3. 字節碼驗證:程序邏輯校驗
    4. 符號引用驗證:引用有效性檢查
  • 準備

    • 靜態變量內存分配
    • 設置零值(int=0, boolean=false)
    • 例外:final static常量直接賦值
  • 解析

    • 符號引用 → 直接引用
    • 類/接口解析、字段解析、方法解析
2.1.3 初始化
  • 執行<clinit>()方法
  • 觸發條件(主動引用):
    • new實例化對象
    • 訪問靜態變量/方法
    • Class.forName()反射
    • 初始化子類觸發父類初始化

2.2 類加載器體系

ClassLoader loader = String.class.getClassLoader();
System.out.println(loader);  // null (Bootstrap類加載器)// 類加載器層次
┌─────────────────┐
│ Bootstrap<--- 最頂層(C++實現)
├─────────────────┤
│ Platform<--- JDK9+ (Extension)
├─────────────────┤
│ System<---Application
├─────────────────┤
│ Custom ClassLoader │
└─────────────────┘
  • 雙親委派模型代碼實現
protected Class<?> loadClass(String name, boolean resolve) {synchronized (getClassLoadingLock(name)) {// 1. 檢查是否已加載Class<?> c = findLoadedClass(name);if (c == null) {try {// 2. 委托父加載器if (parent != null) {c = parent.loadClass(name, false);} else {c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {}if (c == null) {// 3. 自行加載c = findClass(name);}}if (resolve) resolveClass(c);return c;}
}

三、內存模型深度解析

3.1 運行時數據區完整結構

┌───────────────────────────────┐
│         堆 (Heap)             │<--- 所有線程共享
│ ┌──────────┬────────────────┐ │
│ │ 新生代   │ 老年代          │ │
│ │ ├──────┐ │                │ │
│ │ │Eden  │ │                │ │
│ │ ├──────┤ │                │ │
│ │ │S0    │ │                │ │
│ │ ├──────┤ │                │ │
│ │ │S1    │ │                │ │
│ └┴──────┴─┴────────────────┘ │
├───────────────────────────────┤
│        方法區 (Method Area)    │<--- JDK8+: Metaspace
├───────────────────────────────┤
│   JVM棧 (Java Virtual Machine Stacks) │<--- 線程私有
│   ┌──────────────────────────┐│
│   │        棧幀 (Frame)        ││
│   │ ┌────────┬─────────────┐ ││
│   │ │ 局部變量表            │ ││
│   │ ├────────┼─────────────┤ ││
│   │ │ 操作數棧              │ ││
│   │ ├────────┼─────────────┤ ││
│   │ │ 動態鏈接              │ ││
│   │ ├────────┼─────────────┤ ││
│   │ │ 返回地址              │ ││
│   │ └────────┴─────────────┘ ││
│   └──────────────────────────┘│
├───────────────────────────────┤
│   程序計數器 (PC Register)     │<--- 當前指令地址
├───────────────────────────────┤
│   本地方法棧 (Native Stack)    │
└───────────────────────────────┘

3.2 堆內存分配策略

  1. 對象優先在Eden分配

    • 新生代占比:Eden(80%) + Survivor0(10%) + Survivor1(10%)
    • -XX:SurvivorRatio=8 調整比例
  2. 大對象直接進老年代

    • -XX:PretenureSizeThreshold=4M(超過4MB直接進老年代)
  3. 長期存活對象晉升

    • 年齡計數器(對象頭中)
    • -XX:MaxTenuringThreshold=15(默認15次GC后晉升)
  4. 空間分配擔保

    • 老年代連續空間 > 新生代對象總大小
    • 否則觸發Full GC

3.3 對象內存布局(64位系統)

┌───────────────────────────────┐
│       對象頭 (Header) 16字節     │
├──────────────┬────────────────┤
│   Mark Word (8字節)            │
├──────────────┼────────────────┤
│   Klass Pointer (4字節)        │
├──────────────┼────────────────┤
│   Array Length (4字節,可選)    │
├──────────────┴────────────────┤
│       實例數據 (Instance Data)   │
├───────────────────────────────┤
│        對齊填充 (Padding)        │
└───────────────────────────────┘

Mark Word結構

┌───────────────────────────────┐
│  鎖狀態        │  存儲內容         │
├───────────────┼───────────────┤
│  無鎖         │ hashCode(31)   │
│               │ 分代年齡(4)     │
├───────────────┼───────────────┤
│  偏向鎖        │ 線程ID(54)      │
│               │ 時間戳(2)       │
├───────────────┼───────────────┤
│  輕量級鎖      │ 指向棧中鎖記錄的指針 │
├───────────────┼───────────────┤
│  重量級鎖      │ 指向Monitor的指針 │
├───────────────┼───────────────┤
│  GC標記       │ 空             │
└───────────────┴───────────────┘

四、垃圾回收機制深度解析

4.1 可達性分析算法

GC Roots類型

  1. 虛擬機棧中引用的對象
  2. 方法區中靜態屬性引用的對象
  3. 方法區中常量引用的對象
  4. 本地方法棧中JNI引用的對象
  5. Java虛擬機內部引用
  6. 被同步鎖持有的對象

4.2 垃圾收集算法對比

算法實現方式優點缺點適用場景
標記-清除標記存活對象→清除死亡對象簡單直接內存碎片CMS老年代
復制內存分兩塊→存活對象復制到另一塊無碎片、高效空間浪費50%新生代
標記-整理標記→向一端移動→清理邊界外無碎片移動成本高Serial Old
分代收集新生代復制+老年代標記整理綜合最優實現復雜商用JVM默認
分區收集堆劃分多個小區獨立回收可控停頓時間跨分區引用復雜G1/ZGC/Shenandoah

4.3 經典垃圾收集器對比

收集器分代線程算法特點適用場景
Serial新生代單線程復制簡單高效客戶端模式
ParNew新生代多線程復制Serial多線程版配合CMS
Parallel Scavenge新生代多線程復制吞吐量優先后臺計算
Serial Old老年代單線程標記-整理Serial老年代版客戶端模式
Parallel Old老年代多線程標記-整理Parallel Scavenge老年代版吞吐優先應用
CMS老年代并發標記-清除低延遲WEB應用
G1全堆并發標記-整理可預測停頓JDK9+默認
ZGC全堆并發染色指針<10ms停頓超大堆(8TB+)
Shenandoah全堆并發轉發指針低延遲RedHat系JDK

4.4 G1收集器工作流程

初始標記 Initial Mark
根區域掃描 Root Region Scan
并發標記 Concurrent Mark
最終標記 Final Mark
篩選回收 Evacuation
  • 核心創新

    • 分區模型(Region,1-32MB)
    • Remembered Set(RSet)記錄跨區引用
    • SATB(Snapshot-At-The-Beginning)算法
  • 調優參數

    -XX:+UseG1GC 
    -XX:MaxGCPauseMillis=200  # 目標停頓時間
    -XX:InitiatingHeapOccupancyPercent=45  # 觸發并發標記的堆占用率
    -XX:G1HeapRegionSize=16m  # 分區大小
    

五、執行引擎工作原理

5.1 字節碼解釋執行

// 示例字節碼:iadd指令實現
public int add(int a, int b) {return a + b;
}// 對應字節碼:
iload_1  // 加載第一個int參數到操作數棧
iload_2  // 加載第二個int參數
iadd     // 棧頂兩元素相加
ireturn  // 返回結果

5.2 JIT編譯優化技術

  1. 方法內聯(Inlining)

    • 將小方法調用替換為方法體
    • -XX:MaxInlineSize=35(默認內聯小于35字節的方法)
  2. 逃逸分析(Escape Analysis)

    • 棧上分配:對象未逃逸出方法
    • 鎖消除:同步鎖僅被單線程訪問
    • 標量替換:對象拆分為基本類型
  3. 循環優化

    • 循環展開(Loop Unrolling)
    • 循環剝離(Loop Peeling)
  4. 公共子表達式消除

    • 重復計算只執行一次

5.3 分層編譯(Tiered Compilation)

層級編譯方式優化程度啟動速度
0解釋執行最快
1C1簡單編譯基礎優化
2C2完全編譯激進優化
3C1帶性能監控
4C2帶性能監控

啟用參數:-XX:+TieredCompilation(JDK8+默認開啟)

六、JVM調優實戰指南

6.1 內存參數優化

# 堆內存設置
-Xms4g -Xmx4g  # 初始=最大避免動態調整# 新生代設置
-XX:NewRatio=2          # 老年代:新生代=2:1
-XX:SurvivorRatio=8     # Eden:Survivor=8:1# 元空間設置
-XX:MetaspaceSize=256m  
-XX:MaxMetaspaceSize=512m# 直接內存設置
-XX:MaxDirectMemorySize=1g

6.2 GC日志分析

# 啟用詳細GC日志
-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-Xloggc:/path/to/gc.log# 添加時間戳和年齡信息
-XX:+PrintTenuringDistribution

GC日志解讀

2023-08-13T14:23:45.731+0800: [GC pause (G1 Evacuation Pause) (young)[Parallel Time: 25.3 ms, GC Workers: 8][GC Worker Start (ms): Min: 23456.7, Avg: 23456.8, Max: 23456.9, Diff: 0.2][Ext Root Scanning (ms): Min: 0.8, Avg: 1.2, Max: 1.8, Diff: 1.0, Sum: 9.6][Update RS (ms): Min: 0.0, Avg: 0.3, Max: 0.5, Diff: 0.5, Sum: 2.4][Processed Buffers: Min: 0, Avg: 1.6, Max: 3, Diff: 3, Sum: 13][Code Root Scanning (ms): Min: 0.0, Avg: 0.1, Max: 0.2, Diff: 0.2, Sum: 0.8][Object Copy (ms): Min: 22.5, Avg: 22.8, Max: 23.1, Diff: 0.6, Sum: 182.4][Termination (ms): Min: 0.0, Avg: 0.1, Max: 0.2, Diff: 0.2, Sum: 0.8][Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 8][GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.1][GC Worker Total (ms): Min: 24.8, Avg: 24.9, Max: 25.0, Diff: 0.2, Sum: 199.1][GC Worker End (ms): Min: 23481.7, Avg: 23481.7, Max: 23481.7, Diff: 0.0][Code Root Fixup: 0.0 ms][Code Root Purge: 0.0 ms][Clear CT: 0.2 ms][Other: 1.5 ms][Choose CSet: 0.0 ms][Ref Proc: 0.5 ms][Ref Enq: 0.0 ms][Redirty Cards: 0.2 ms][Humongous Register: 0.1 ms][Humongous Reclaim: 0.0 ms][Free CSet: 0.3 ms][Eden: 2048.0M(2048.0M)->0.0B(2048.0M) Survivors: 1024.0M->1024.0M Heap: 4096.0M(8192.0M)->3072.0M(8192.0M)][Times: user=0.20 sys=0.01, real=0.03 secs]

6.3 內存泄漏排查

  1. 生成堆轉儲文件

    jmap -dump:format=b,file=heapdump.hprof <pid>
    
  2. 使用MAT分析步驟

    • 打開heapdump.hprof
    • 查看直方圖(Histogram)
    • 查找支配樹(Dominator Tree)
    • 分析路徑到GC Roots(Path to GC Roots)
    • 檢查重復集合(Duplicate Classes)

七、JVM內部機制深度探秘

7.1 鎖優化技術

  1. 偏向鎖

    • 適用于單線程訪問場景
    • 對象頭記錄線程ID
  2. 輕量級鎖

    • 使用CAS避免阻塞
    • 棧幀中創建Lock Record
  3. 鎖膨脹

    • 競爭激烈時升級為重量級鎖
    • 對象頭指向Monitor對象
  4. 自旋鎖

    • -XX:PreBlockSpin=10(默認自旋10次)
    • 自適應自旋(JDK6+)

7.2 內存屏障與happens-before

JMM定義的happens-before規則

  1. 程序順序規則
  2. 監視器鎖規則
  3. volatile變量規則
  4. 線程啟動規則
  5. 線程終止規則
  6. 中斷規則
  7. 終結器規則
  8. 傳遞性規則

內存屏障類型

屏障類型作用對應指令
LoadLoad保證Load1先于Load2ifence (x86)
StoreStore保證Store1先于Store2sfence (x86)
LoadStore保證Load先于后續Store
StoreLoad保證Store先于后續Loadmfence (x86)

7.3 JIT編譯日志分析

# 啟用JIT編譯日志
-XX:+PrintCompilation
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintInlining# 示例輸出:42   3       java.lang.String::hashCode (55 bytes)43   1       java.util.ArrayList::add (29 bytes)45   4       java.util.HashMap::put (65 bytes)   inline (hot)47   2       java.io.FileInputStream::read (0 bytes)   intrinsic

八、JVM發展趨勢

8.1 新一代GC對比

特性ZGCShenandoahG1
最大堆大小16TB32TB64GB
停頓目標<1ms<10ms200ms
算法核心染色指針轉發指針分區模型
內存開銷~2%~5-10%~10-20%
生產就緒JDK15+JDK12+JDK9+默認

8.2 GraalVM創新

  1. 多語言支持

    • Java, JavaScript, Python, Ruby等
  2. 提前編譯(AOT)

    native-image -jar app.jar
    
  3. 高性能編譯器

    • 替代C2編譯器
    • -XX:+UseJVMCICompiler

8.3 Project Loom(纖程)

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {IntStream.range(0, 10_000).forEach(i -> {executor.submit(() -> {Thread.sleep(Duration.ofSeconds(1));return i;});});
}

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

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

相關文章

QT中ARGB32轉ARGB4444優化4K圖像性能的實現方案(完整源碼)

QT中ARGB32轉ARGB4444優化4K圖像性能的實現方案&#xff08;完整源碼&#xff09; 一、問題背景 在QT界面項目中&#xff0c;4K圖像采用QImage::Format_ARGB32格式&#xff08;4字節/像素&#xff09;時&#xff0c;因數據量大導致編解碼疊加性能不足。底層framebuffer實際為AR…

反射在Spring IOC容器中的應用——動態創建Bean

今天在看Java八股文時&#xff0c;對這里產生了一些疑惑&#xff0c;因為在目前做的練手項目中還沒有用到過除了new以外的新建對象方式&#xff0c;在請教了其他前輩后對此有了新的理解&#xff0c;所以專門記錄以用于梳理思路和復習基礎。這里著重講解反射機制實現新建對象這里…

TRS(總收益互換)系統架構設計:多市場交易的技術實現分析

一、多市場交易環境的技術特征 1.1 市場機制差異&#xff08;技術視角&#xff09;技術維度典型實現差異交割周期T0/T1/T2等多種結算模式價格穩定機制部分市場存在波動率控制措施系統接入協議FIX 4.4/ITCH/OMD-C等協議族衍生品支持工具種類與中央對手方清算差異1.2 技術挑戰分析…

深度學習-卷積神經網絡CNN-批量歸一化 BatchNorm

為什么需要批量規范化層呢&#xff1f;讓我們來回顧一下訓練神經網絡時出現的一些實際挑戰&#xff1a;首先&#xff0c;數據預處理的方式通常會對最終結果產生巨大影響。 回想一下我們應用多層感知機來預測房價的例子。使用真實數據時&#xff0c;我們的第一步是標準化輸入特征…

機器學習-支持向量機器(SVM)

0.1 數字識別 from sklearn.svm import SVC from sklearn.metrics import silhouette_score import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.feature_extraction import DictVectorizer from sk…

昆山PCB板工廠有哪些?

在長三角電子信息產業版圖中&#xff0c;昆山憑借完整的產業鏈配套和精湛的制造工藝&#xff0c;成為國內PCB&#xff08;印制電路板&#xff09;生產的重要基地。本文精選五家具有代表性的本土工廠&#xff0c;從技術實力到服務特色展開深度剖析&#xff0c;為行業客戶提供精準…

rk3588 ubuntu20.04安裝包經常出現的問題總結(chatgpt回復)

問題1 問題 我在rk3588 ubuntu20.04安裝相關環境的時候經常出現下面類似的問題&#xff0c;如何系統的解決 The following packages have unmet dependencies : openssh-server : Depends: openssh-client ( 1:8.2p1-4ubuntu0.13) but 1:8.2p1-4ubuntu0.11 is to be installed …

從根源到生態:Apache Doris 與 StarRocks 的深度對比 —— 論開源基因與長期價值的優越性

在 OLAP 領域&#xff0c;Apache Doris 與 StarRocks 常被一同提及&#xff0c;兩者有著深厚的技術淵源 ——StarRocks 源自 Apache Doris 的代碼 Fork&#xff0c;卻在后續發展中走向了不同的路徑。本文將從代碼根源、架構演進、社區生態、功能特性等多維度展開對比。 一、代…

【從零開始學習Redis】項目實戰-黑馬點評D1

項目實戰-黑馬點評 項目架構短信登錄發送短信驗證碼 實現思路就是按照上圖左一部分&#xff0c; 實現類如下 Slf4j Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {/*** 驗證手機號發送驗證碼** param phone* pa…

自然語言處理的范式轉變:從Seq2Seq模型到Transformer架構

Seq2Seq 定義 Seq2Seq是一個Encoder-Decoder結構的網絡&#xff0c;它的輸入是一個序列&#xff0c;輸出也是一個序列&#xff0c; Encoder使用循環神經網絡(RNN,GRU&#xff0c;LSTM等)&#xff0c;將一個可變長度的信號序列(輸入句子)變為固定維度的向量編碼表達&#xff0c;…

【博客系統測試報告】---接口自動化測試

目錄 1、需求分析 2、挑選接口 3、設計博客系統的測試用例 4、設計自動化測試框架 test_add.py: test_detail.py: test_getAuthorInfo.py: test_getUserInfo: test_list.py: test_login.py: logger_util.py: request_util.py: yaml_util.py: 1、需求分析 根據業務…

Mysql數據庫遷移到GaussDB注意事項

mysql數據庫遷移高斯數據庫 建議開啟高斯數據庫M模式&#xff0c;mysql兼容模式&#xff0c;可以直接使用mysql的建表語句&#xff0c;自增主鍵可以使用AUTO_INCREMENT&#xff0c;如果不開啟M模式&#xff0c;只能使用高斯數據庫的序列添加自增主鍵1&#xff1a;如果使用數據庫…

蘋果正計劃大舉進軍人工智能硬件領域

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

Serverless 架構核心解析與應用實踐

Serverless 的核心定義與優勢??核心定義Serverless&#xff08;無服務器架構&#xff09;是一種云計算模型&#xff0c;開發者無需關注底層服務器管理&#xff0c;由云服務商自動分配資源、彈性擴縮容&#xff0c;并按實際使用量計費?。其核心特點包括&#xff1a;?按需計算…

Redis持久化機制詳解:RDB與AOF的全面對比與實踐指南

目錄 一、RDB持久化機制 1.1 RDB概述 1.2 RDB觸發機制 1) 手動執行save命令 2) 手動執行bgsave命令 3) Redis正常關閉時 4) 自動觸發條件滿足時 1.3 RDB詳細配置 1.4 RDB實現原理 1.5 RDB的優缺點分析 二、AOF持久化機制 2.1 AOF概述 2.2 AOF工作流程 2.3 AOF同步…

介紹一下jQuery的AJAX異步請求

目錄 一、核心方法&#xff1a;$.ajax() 二、簡化方法&#xff08;常用場景&#xff09; 1. $.get()&#xff1a;快速發送 GET 請求&#xff08;獲取數據&#xff09; 2. $.post()&#xff1a;快速發送 POST 請求&#xff08;提交數據&#xff09; 3. $.getJSON()&#xf…

Win10系統Ruby+Devkit3.4.5-1安裝

Win10系統RubyDevkit3.4.5-1安裝安裝步驟軟件工具安裝Ruby安裝gem mysql2處理libmysql.dll驗證mysql2安裝步驟 軟件工具 mysql-connector-c-6.1.11-winx64.zip rubyinstaller-devkit-3.4.5-1-x64.exe 安裝Ruby 執行rubyinstaller-devkit-3.4.5-1-x64.exe&#xff0c;期間可…

社交工程:洞穿人心防線的無形之矛

在網絡安全領域&#xff0c;一道無形的裂痕正在迅速蔓延。它不是復雜的零日漏洞&#xff0c;也不是精妙的惡意代碼&#xff0c;而是利用人性弱點進行攻擊的古老技藝——社交工程。當全球網絡安全支出突破千億美元大關&#xff0c;防火墻筑得越來越高&#xff0c;加密算法越來越…

Go 并發控制利器 ants 使用文檔

https://github.com/panjf2000/ants1.1 什么是 ants ants 是一個高性能的 Go 語言 goroutine 池&#xff0c;它能復用已完成任務的 goroutine&#xff0c;避免頻繁創建和銷毀 goroutine&#xff0c;節省 CPU 與內存開銷&#xff0c;并且能限制并發數量防止資源被耗盡。 1.2 安裝…

Day57--圖論--53. 尋寶(卡碼網)

Day57–圖論–53. 尋寶&#xff08;卡碼網&#xff09; 今天學習&#xff1a;最小生成樹。有兩種算法&#xff08;Prim和Kruskal&#xff09;和一道例題。 prim 算法是維護節點的集合&#xff0c;而 Kruskal 是維護邊的集合。 最小生成樹&#xff1a;所有節點的最小連通子圖&am…