JVM核心原理與實戰優化指南

一、成為卓越的Java開發者

無論你是大學生還是資深工程師,學習JVM都至關重要。你可能是為了:

  • 征服技術面試
  • 進行系統調優
  • 深入理解Java生態

學習路徑建議
從Java語言本質切入,逐步深入JVM核心機制,兼顧不同背景學習者的認知梯度。

1.1 Java語言本質

Java是一門跨平臺、面向對象的高級編程語言,其核心優勢在于“Write Once, Run Anywhere”。

1.2 編程語言的作用

編程語言是人類與計算機溝通的契約

  • 通過標準化語法向計算機發出指令
  • 精確定義數據結構和操作邏輯

1.3 計算機如何理解指令

1.3.1 計算機發展簡史
時期技術特征代表設備
1946-1958電子管ENIAC
1958-1964晶體管IBM 7090
1964-1970集成電路IBM System/360
1970-至今大規模集成電路現代PC/服務器
未來量子/生物計算量子計算機原型
1.3.2 馮·諾依曼體系結構

計算機五大核心組件:

  1. 運算器
  2. 控制器
  3. 存儲器
  4. 輸入設備
  5. 輸出設備
1.3.3 指令執行四階段
  1. 提取:數據加載到內存
  2. 解碼:指令轉譯(依賴CPU指令集ISA)
  3. 執行:運算器處理數據
  4. 寫回:結果輸出
1.3.4 機器語言困境

直接操作二進制(0101)存在三大痛點:

  • 不同廠商CPU指令集不兼容(Intel/AMD/ARM)
  • 開發效率極低
  • 硬件資源管理復雜
1.3.5 編程語言演進
語言類型代表特點缺點
機器語言二進制指令硬件直接執行難于編寫和維護
匯編語言MOV, ADD效率高,貼近硬件移植性差
高級語言Java, Python開發效率高,可移植性強需轉換機器碼
1.3.6 高級語言的執行方式
類型原理代表語言流程圖示
編譯型源碼一次性轉機器碼C, C++, Go
解釋型逐行翻譯并立即執行Python, JS
混合型編譯+解釋(字節碼機制)Java

1.4 JVM的核心作用

Java虛擬機(JVM)是跨平臺能力的基石

  • 將字節碼翻譯為機器指令
  • 管理內存與安全沙箱
  • 動態編譯優化(JIT)

1.5 JDK/JRE/JVM關系

組件全稱功能說明
JDKJava Development Kit開發工具包(含JRE+編譯器+調試器)
JREJava Runtime Environment運行環境(含JVM+核心類庫)
JVMJava Virtual Machine執行字節碼的虛擬機引擎

二、深入JVM核心機制

2.1 從源碼到類文件

2.1.1 編譯流程詳解
// Person.java 示例
public class Person {private String name;public String getName() {return name;}
}

編譯步驟

  1. javac -g:vars Person.java → 生成Person.class
  2. 詞法分析:拆分代碼為Token流(如public, class, {
  3. 語法分析:構建抽象語法樹(AST)
  4. 語義分析:校驗類型/作用域合法性
  5. 字節碼生成:輸出Class文件
2.1.2 Class文件結構

16進制查看工具

  • hexdump -C Person.class
  • xxd Person.class

官方定義(Oracle JVMS §4)

ClassFile {u4 magic;// 魔數CAFEBABEu2 minor_version;// 次版本號u2 major_version;// 主版本號(52=JDK8)u2 constant_pool_count;// 常量池計數cp_info constant_pool[];// 常量池表u2 access_flags;// 類訪問標志u2 this_class;// 當前類索引// ... 其他字段
}
2.1.3 常量池深度解析

常量類型示例

字節碼類型標記說明
0x0A10方法引用(CONSTANT_Methodref)
0x088字符串(CONSTANT_String)
0x099字段引用(CONSTANT_Fieldref)

手工分析常量池

  1. 首字節0A → 方法引用
  2. 后續2字節:類索引00 0A(指向常量池#10)
  3. 后續2字節:名稱類型索引00 2B(指向常量池#43)
2.1.4 反編譯驗證工具
javap -v -p Person.class

輸出關鍵內容

  • 常量池明細
  • 字段/方法描述符
  • 字節碼指令


2.2 類加載機制

2.2.1 生命周期三階段

  1. 裝載(Loading)
  • 通過全限定名獲取二進制流
  • 轉化靜態結構為方法區運行時數據
  • 生成堆中的Class對象
  1. 鏈接(Linking)
  • 驗證:文件格式/元數據/字節碼/符號引用
  • 準備:為靜態變量分配內存(默認初始化)
static int value = 123; // 準備階段value=0,初始化后變為123
  • 🔗 解析:符號引用→直接引用
  1. 初始化(Initialization)
  • 執行<clinit>()方法(靜態塊和靜態變量賦值)
2.2.2 類加載器體系

四大加載器

  1. Bootstrap:加載JRE/lib/rt.jar(C++實現)
  2. Extension:加載JRE/lib/ext/*.jar
  3. Application:加載CLASSPATH下的類
  4. Custom:用戶自定義類加載器

雙親委派流程

未找到
未找到
未找到
自定義加載器
AppClassLoader
ExtClassLoader
BootstrapLoader

破壞雙親委派的場景

  • Tomcat的Webapp隔離機制
  • SPI服務加載(如JDBC驅動)
  • OSGi動態模塊化

2.3 運行時數據區

2.3.1 核心區域概覽

區域線程共享作用
方法區存儲類信息/JIT代碼/運行時常量池
存儲對象實例和數組
虛擬機棧保存方法調用的棧幀
程序計數器記錄當前線程執行位置
本地方法棧服務于Native方法
2.3.2 棧幀深度解析

棧幀結構

  • 局部變量表:存放方法參數和局部變量
  • 操作數棧:執行字節碼指令的工作區
  • 動態鏈接:指向運行時常量池的引用
  • 方法返回地址:恢復上層方法執行點

字節碼執行示例

public int calc() {int a = 100;int b = 200;return a + b;
}

對應字節碼:

0: bipush 100// 常量100入棧
2: istore_1// 存入局部變量表slot1
3: sipush 200// 常量200入棧
6: istore_2// 存入slot2
7: iload_1// 加載slot1的值
8: iload_2// 加載slot2的值
9: iadd// 棧頂兩數相加
10: ireturn// 返回結果
2.3.3 內存交互關系
  1. 棧→堆:棧幀中引用指向堆對象
Object obj = new Object(); // 棧中ref指向堆內存
  1. 方法區→堆:靜態變量引用堆對象
private static Map cache = new HashMap();
  1. 堆→方法區:對象通過Klass指針關聯類元數據

對象內存布局

  • 對象頭(Mark Word + Klass指針)
  • 實例數據(字段值)
  • 對齊填充(8字節對齊)

2.4 內存模型與GC

2.4.1 堆內存分代設計

  • 新生代(Young Generation):
  • Eden區(80%)
  • Survivor區(S0+S1=20%)
  • 老年代(Old Generation)

對象分配流程

優先
Eden滿
存活對象
年齡閾值15
新對象
Eden區
Minor GC
Survivor區
老年代
2.4.2 GC類型與觸發條件
GC類型作用區域觸發條件
Minor GC新生代Eden區滿
Major GC老年代老年代空間不足
Full GC整個堆+方法區System.gc()/老年代無法分配等

分代設計原因

提升GC效率:多數對象朝生夕死(IBM研究:98%對象存活時間<1ms)
降低停頓時間:Minor GC僅掃描新生代
優化內存分配:TLAB(Thread Local Allocation Buffer)降低并發競爭

2.4.3 垃圾判定算法
  1. 引用計數法(Python):
  • 簡單高效
  • 循環引用無法回收
class A { B ref; }
class B { A ref; }
// A.ref = B; B.ref = A; 導致無法回收
  1. 可達性分析(Java采用):
  • GC Roots包括:
  • 棧中引用的對象
  • 方法區靜態/常量引用
  • JNI本地方法引用
2.4.4 垃圾回收算法
算法原理優缺點
標記-清除標記后直接清除?簡單?碎片化
標記-復制存活對象復制到保留區?無碎片 ?空間利用率50%
標記-整理標記后整理到內存一端?無碎片 ?移動成本高

分代算法選擇

  • 新生代:標記-復制(Survivor復制優化)
  • 老年代:標記-整理(CMS并發標記+并行整理)
2.4.5 主流垃圾收集器
收集器區域算法特點
Serial新生代復制單線程 STW時間長
Parallel Scavenge新生代復制多線程 吞吐量優先
CMS老年代標記-清除并發收集 低停頓
G1全堆分Region標記-整理可預測停頓 STW可控
ZGC全堆著色指針<10ms停頓 TB級堆支持

G1核心機制

  • Region分區(1MB~32MB)
  • Remembered Set(RSet)記錄跨區引用
  • Mixed GC:回收部分老年代Region

2.5 內存溢出實戰分析

2.5.1 堆內存溢出
// -Xmx20m -Xms20m
@RestController
public class HeapController {List<byte[]> list = new ArrayList<>();@GetMapping("/heap")public String heap() {while (true) {list.add(new byte[1024 * 1024]); // 持續分配1MB對象}}
}

現象java.lang.OutOfMemoryError: Java heap space

2.5.2 方法區溢出
// -XX:MetaspaceSize=50M -XX:MaxMetaspaceSize=50M
public class MetaSpaceOOM {static class OOMObject {}public static void main(String[] args) {int i = 0;try {while (true) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(OOMObject.class);enhancer.setUseCache(false);enhancer.setCallback((MethodInterceptor) (o, method, objects, methodProxy) ->methodProxy.invokeSuper(o, args));enhancer.create(); // 動態生成類i++;}} catch (Exception e) {System.out.println("生成次數: " + i);throw e;}}
}

現象java.lang.OutOfMemoryError: Metaspace

2.5.3 棧溢出
public class StackOverflow {private int stackLength = 0;public void stackLeak() {stackLength++;stackLeak(); // 無限遞歸}public static void main(String[] args) {StackOverflow obj = new StackOverflow();try {obj.stackLeak();} catch (Throwable e) {System.out.println("棧深度: " + obj.stackLength);throw e;}}
}

現象java.lang.StackOverflowError


三、JVM調優實戰

3.1 JVM參數體系

3.1.1 參數類型詳解
類型前綴示例說明
標準參數--version, -help所有JVM實現必須支持
-X參數-X-Xmx20g, -Xss1m非標準(但基本通用)
-XX參數-XX-XX:+UseG1GC, -XX:MaxGCPauseMillis=200控制JVM底層行為
3.1.2 常用調優參數表
參數作用范圍說明
-Xms4096m初始堆大小
-Xmx4096m最大堆大小
-XX:NewRatio=3老年代/新生代=3/1
-XX:SurvivorRatio=8新生代Eden/Survivor=8/1
-XX:MaxMetaspaceSize=256m方法區元空間上限
-XX:+HeapDumpOnOutOfMemoryError內存溢出OOM時自動生成堆轉儲
-XX:HeapDumpPath=/logs/java_heap.hprof堆轉儲指定dump文件路徑
-XX:+UseG1GCGC啟用G1收集器
-XX:MaxGCPauseMillis=200G1目標停頓時間
-XX:InitiatingHeapOccupancyPercent=45G1觸發并發GC周期的堆使用率閾值
3.1.3 參數查看與設置
  1. 查看默認值
java -XX:+PrintFlagsFinal -version
  1. 運行時調整
jinfo -flag MaxHeapFreeRatio 1234# 查看進程1234的參數
jinfo -flag +PrintGCDetails 1234# 動態開啟GC日志

3.2 診斷命令工具箱

3.2.1 進程與線程分析
命令功能示例
jps查看Java進程jps -lvm
jstack線程棧分析jstack -l 1234 > thread.txt
jinfo實時查看/修改參數jinfo -flags 1234

死鎖檢測案例

// 省略死鎖代碼(見原文檔)

診斷步驟

  1. jstack -l 1234 > stack.log
  2. 搜索deadlock關鍵詞:
Found one Java-level deadlock:
"Thread-1":
waiting to lock monitor 0x00007f3e4800edc0 (object 0x000000076d26e658)
which is held by "Thread-0"
3.2.2 內存與GC監控
命令功能示例
jstat內存/GC統計jstat -gcutil 1234 1000 5
jmap堆內存快照jmap -dump:live,format=b,file=heap.bin 1234

關鍵指標解釋

  • S0C/S1C:Survivor區容量 (KB)
  • EU/EU:Eden區使用量/容量
  • OC/OU:老年代使用量/容量
  • YGC/YGCT:Young GC次數/耗時

3.3 GC調優實戰

3.3.1 G1調優四步法
  1. 基礎參數設置
-XX:+UseG1GC -Xmx4g -Xms4g
  1. 啟用詳細日志
-Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps
  1. 分析工具選擇
  • GCViewer
  • GCEasy(在線分析)
  1. 漸進式調整
  • 首次調整:-XX:MaxGCPauseMillis=200
  • 二次調整:-XX:InitiatingHeapOccupancyPercent=35
  • 內存不足? → 擴容堆大小
3.3.2 G1最佳實踐
  • 避免手動設年輕代大小:G1自動調整Region分布

  • 關注吞吐量與停頓平衡

    • 高吞吐場景:增大-XX:G1ReservePercent(默認為10%)
    • 低延遲場景:減小MaxGCPauseMillis(但需防退化Full GC)
  • Mixed GC優化

    • 調整-XX:G1MixedGCLiveThresholdPercent(默認為65%)
    • 增加-XX:G1MixedGCCountTarget(默認8次)

4、高階性能優化

4.1 內存優化策略

4.1.1 秒殺場景內存防護
用戶請求
Nginx限流
Redis緩存扣減
消息隊列削峰
服務層處理
數據庫寫入

關鍵措施

  • 前端:頁面靜態化+按鈕防抖
  • 網關:令牌桶限流(如Guava RateLimiter)
  • 服務層:本地緩存+對象復用(避免大量臨時對象)
  • JVM:增大堆內存+啟用G1的IHOP調優
4.1.2 內存泄漏排查

ThreadLocal泄漏場景

public class ThreadLocalLeak {private static ThreadLocal<byte[]> threadLocal = new ThreadLocal<>();@GetMapping("/leak")public String leak() {threadLocal.set(new byte[1024 * 1024]); // 線程不銷毀導致泄漏return "OK";}
}

診斷工具組合

  1. jmap -histo:live 1234 | grep 'byte\[\]'// 觀察byte[]數量增長
  2. MAT分析堆轉儲:定位ThreadLocal引用鏈

4.2 GC疑難問題

4.2.1 Full GC頻繁原因
誘因解決方案
內存分配過快降低對象創建速率(對象池化)
老年代空間不足增大堆或優化對象晉升策略
MetaSpace不足調整-XX:MaxMetaspaceSize
System.gc()調用禁用-XX:+DisableExplicitGC
4.2.2 G1的Evacuation Failure

現象:日志出現to-space exhausted
根因

  • Survivor區不足
  • 巨型對象分配失敗

解決

  • 增大-XX:G1ReservePercent(預留內存比例)
  • 避免分配超大對象(>Region 50%)

4.3 終極優化指南


優化優先級

  1. 架構優化:緩存/異步/分庫分表
  2. 代碼優化:算法/數據結構
  3. JVM參數調優:GC選擇/內存分配
  4. OS與硬件:NUMA/SSD

4.4 經典面試題解析

  1. 內存泄漏 vs 內存溢出

泄漏:對象無法回收(如未關閉的連接)→ 溢出:泄漏積累或瞬時高負載

  1. G1 vs CMS的區別
維度G1CMS
內存模型Region分區連續分代
算法標記-整理標記-清除
停頓控制可預測停頓模型并發收集但不可預測
適用場景大堆(>6GB)低延遲需求中小堆追求高吞吐
  1. 方法區回收條件
  • 類的所有實例已被回收
  • 加載該類的ClassLoader已被回收
  • 無任何地方引用該類的Class對象

全文總結:JVM調優是理論與實踐的結合,切忌盲目調整。核心原則是:

  • 數據驅動:通過監控工具獲取證據
  • 目標導向:明確優化目標(吞吐量/延遲)
  • 漸進迭代:每次只調整一個參數并觀測效果

掌握JVM,不僅為了面試通關,更是構建高并發、低延遲系統的核心競爭力!

JVM面試看《面試》專欄詳解
在這里插入圖片描述

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

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

相關文章

TCP/IP、socket、http

區分與聯系 TCP/IP 是底層規則,規定數據如何傳輸; Socket 是操作 TCP/IP 的工具,讓程序能實現通信; HTTPS 是上層應用,用 Socket 調用 TCP/IP 協議,實現安全的數據傳輸。 應用層:HTTPS(基于 HTTP + SSL/TLS)| | socket連接了應用層和傳輸層↓ 傳輸層:TCP(可靠…

Go語言中的指針接收者

Go語言中的指針接收者&#xff08;Pointer Receiver&#xff09;與Java類中的方法在設計思想上確實有相似之處&#xff0c;尤其在對象狀態修改和性能優化上&#xff0c;但兩者在實現機制和語言哲學上存在顯著差異。以下從核心特性、設計對比和應用場景展開分析&#xff1a;一、…

計算機視覺(opencv)實戰三——圖像運算、cv2.add()、cv2.addWeighted()

圖像運算詳解&#xff1a;加法運算與加權運算在數字圖像處理中&#xff0c;圖像運算是基礎且常用的操作之一。它能夠對兩幅圖像或圖像與常數進行加減乘除&#xff0c;從而實現亮度調整、融合疊加、特效制作等功能。本文將重點介紹 OpenCV 中的圖像加法運算與加權運算&#xff0…

Redis核心架構

一、核心模塊如圖 Client 客戶端&#xff0c;官方提供了 C 語言開發的客戶端&#xff0c;可以發送命令&#xff0c;性能分析和測試等。網絡層事件驅動模型&#xff0c;基于 I/O 多路復用&#xff0c;封裝了一個短小精悍的高性能 ae 庫&#xff0c;全稱是 a simple event-driven…

Python爬蟲大師課:HTTP協議深度解析與工業級請求封裝

Python爬蟲大師課&#xff1a;HTTP協議深度解析與工業級請求封裝 從零構建企業級爬蟲框架&#xff08;附完整源碼&#xff09; 一、爬蟲基礎&#xff1a;網絡世界的通行證 ??HTTP協議核心數據??&#xff1a; 全球網站數量&#xff1a;20億 HTTP請求占比&#xff1a;83% …

機器學習——PCA(主成分分析)降維

PCA&#xff08;主成分分析&#xff09;降維詳解一、什么是 PCAPCA&#xff08;Principal Component Analysis&#xff0c;主成分分析&#xff09;是一種常用的數據降維方法。它通過線性變換將原始的高維數據映射到低維空間&#xff0c;同時盡可能保留原數據的主要信息&#xf…

把 AI 裝進“冰箱貼”——基于超低功耗語音合成的小屏電子價簽

標簽&#xff1a;電子價簽、語音合成、TTS、超低功耗、電子墨水、BLE、離線語音 ---- 1. 背景&#xff1a;價簽也要開口說話&#xff1f; 超市做促銷&#xff0c;顧客拿價簽一掃&#xff0c;“今日番茄 2.99 元/斤&#xff0c;會員再享 9 折” 直接語音播放。 硬件限制&#xf…

挖漏洞是什么意思?挖漏洞賺錢入門到精通,收藏這篇就夠了!

挖漏洞是什么意思&#xff1f;挖漏洞賺錢入門到精通&#xff0c;收藏這篇就夠了&#xff01; 什么是漏洞挖掘 漏洞挖掘是指通過分析軟件、系統或網絡中存在的安全漏洞來發現并利用這些漏洞。漏洞挖掘是信息安全領域的一項重要工作&#xff0c;可以幫助企業和組織提高系統的安…

如何理解AP中SM中宿主進程?

在AUTOSAR Adaptive Platform&#xff08;AP&#xff09;中&#xff0c;狀態管理&#xff08;State Management, SM&#xff09;的宿主進程&#xff08;Host Process&#xff09; 是實現狀態機運行的核心載體&#xff0c;其本質與運作機制可通過以下結構化解析深入理解&#xf…

無人機光電探測模塊技術分析

一、技術要點1. 多光譜成像技術 可見光與紅外融合&#xff1a;白天依賴可見光高分辨率成像&#xff08;識別外形、顏色&#xff09;&#xff0c;夜間或低光照條件下切換至紅外熱成像&#xff08;捕捉0.5℃級溫差&#xff09;&#xff0c;通過雙波段互補提升全天候能力。 激光…

第40周——GAN入門

目錄 目錄 目錄 前言 一、定義超參數 二、下載數據 三、配置數據 四、定義鑒別器 五、訓練模型并保存 總結 前言 &#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 一、定義超參數 import argparse import os i…

Nginx性能優化與安全配置:打造高性能Web服務器

系列文章索引&#xff1a; 第一篇&#xff1a;《Nginx入門與安裝詳解&#xff1a;從零開始搭建高性能Web服務器》第二篇&#xff1a;《Nginx基礎配置詳解&#xff1a;nginx.conf核心配置與虛擬主機實戰》第三篇&#xff1a;《Nginx代理配置詳解&#xff1a;正向代理與反向代理…

二分算法(模板)

例題1&#xff1a; 704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a;&#xff08;二分&#xff09; 通過遍歷也可以通過&#xff0c;但是二分更優且數據量越大越能體現。 二分思路&#xff1a; 1.mid1 (left right)/2 與 mid2 right (right …

VUE3 學習筆記2 computed、watch、生命周期、hooks、其他組合式API

computed 計算屬性在vue3中&#xff0c;雖然也能寫vue2的computed&#xff0c;但還是更推薦使用vue3語法的computed。在Vue3中&#xff0c;計算屬性是組合式API&#xff0c;要想使用computed&#xff0c;需要先對computed進行引入&#xff1a;import { computed } from vuecomp…

【java面試day13】mysql-定位慢查詢

文章目錄問題&#x1f4ac; Question 1相關知識問題 &#x1f4ac; Question 1 Q&#xff1a;這條sql語句執行很慢&#xff0c;你如何分析呢&#xff1f; A&#xff1a;當一條 SQL 執行較慢時&#xff0c;可以先使用 EXPLAIN 查看執行計劃&#xff0c;通過 key 和 key_len 判…

3分鐘解鎖網頁“硬盤“能力:離線運行VSCode的新一代Web存儲技術

Hi&#xff0c;我是前端人類學&#xff08;之前叫布蘭妮甜&#xff09;&#xff01; “這不是瀏覽器&#xff0c;這是裝了個硬盤。” —— 用戶對現代Web應用能力的驚嘆 隨著Origin Private File System和IndexedDB Stream等新技術的出現&#xff0c;Web應用現在可以在用戶的設…

LT6911GXD,HD-DVI2.1/DP1.4a/Type-C 轉 Dual-port MIPI/LVDS with Audio 帶音頻

簡介LT6911GXD是一款高性能HD-DVI2.1/DP1.4a/Type-c轉Dual-port MIPI/LVDS芯片&#xff0c;兼容 HDMI2.1、HDMI2.0b、HDMI1.4、DVI1.0、DisplayPort 1.4a、eDP1.4b 等多種視頻接口標準。支持4K(38402160)60Hz的DSC直通。應用場景AR/VR設備LT6911GXD 支持高達 4K&#xff08;384…

【100頁PPT】數字化轉型某著名企業集團信息化頂層規劃方案(附下載方式)

篇幅所限&#xff0c;本文只提供部分資料內容&#xff0c;完整資料請看下面鏈接 https://download.csdn.net/download/2501_92808811/91662628 資料解讀&#xff1a;數字化轉型某著名企業集團信息化頂層規劃方案 詳細資料請看本解讀文章的最后內容 作為企業數字化轉型領域的…

高精度標準鋼卷尺優質廠家、選購建議

高精度標準鋼卷尺的優質廠家通常具備精湛工藝與權威精度認證等特征&#xff0c;能為產品質量提供保障。其選購需兼顧精度標識、使用場景、結構細節等多方面&#xff0c;具體介紹如下&#xff1a;一、高精度標準鋼卷尺優質廠家**1、河南普天同創&#xff1a;**PTTC-C5標準鋼卷尺…

38 C++ STL模板庫7-迭代器

C STL模板庫7-迭代器 文章目錄C STL模板庫7-迭代器一、迭代器的核心作用二、迭代器的五大分類與操作三、關鍵用法與代碼示例1. 迭代器的原理2. 迭代器用法與示例3. 迭代工具用法示例4. 使用技巧迭代器是C中連接容器與算法的通用接口&#xff0c;提供了一種訪問容器元素的統一方…