JVM--虛擬線程

首先了解一個理念:線程與 OS 線程 1:1 綁定

在傳統 Java 線程(平臺線程)模型中:

  1. 每個 Java 線程直接對應一個操作系統級別的線程

  2. 操作系統負責調度這些線程

  3. 線程的創建、管理和調度都由操作系統內核處理

  4. 這種模型稱為?1:1 線程模型(一個用戶線程對應一個內核線程)

圖解傳統線程模型

虛擬線程的 M:N?模型

什么是虛擬線程

1. 什么是虛擬線程?

????????虛擬線程是一種輕量級的線程,由JVM管理,而不是操作系統。它們被設計用來顯著減少編寫、維護和觀察高吞吐量并發應用程序的工作量。

????????傳統線程(平臺線程):每個線程都直接對應一個操作系統線程(內核線程)。創建大量平臺線程會消耗大量系統資源(內存和調度開銷),因此限制了應用程序的并發能力。

????????虛擬線程:它們是用戶模式的線程,由JVM調度,多個虛擬線程可以運行在同一個平臺線程(稱為載體線程)上。虛擬線程的創建和切換成本極低,因此可以創建數百萬個虛擬線程而不會導致系統資源耗盡。

2. 為什么需要虛擬線程?

????????在傳統的“一個請求一個線程”的服務器應用程序中,由于平臺線程的資源限制,通常只能處理數千個并發連接。當有大量I/O等待時(如數據庫調用、網絡請求),線程被阻塞,導致資源浪費。

????????虛擬線程通過以下方式解決

????????????????高效阻塞:當虛擬線程執行阻塞操作(如I/O)時,它會自動從載體線程上卸載,從而釋放載體線程去執行其他虛擬線程。當阻塞操作完成時,虛擬線程會被調度到某個載體線程上繼續執行。

????????????????高并發:可以創建大量虛擬線程(如百萬級別),使得每個請求可以在自己的虛擬線程中運行,而無需復雜的異步編程模型(如CompletableFuture或反應式編程)。

Java 虛擬線程

前言

????????虛擬線程(Virtual Threads)是 Java 并發模型的革命性創新,在?Java 19?作為預覽特性引入,Java 21?正式發布。這是 Project Loom 的核心成果,旨在解決傳統線程的瓶頸問題。


一、核心問題:傳統線程的局限性

傳統的Java線程

// 傳統線程模型(平臺線程)
ExecutorService executor = Executors.newFixedThreadPool(200);
for (int i = 0; i < 10_000; i++) {executor.submit(() -> {Thread.sleep(1000); // 模擬I/O阻塞return processRequest();});
}); }

痛點

  1. 線程與 OS 線程 1:1 綁定

  2. 創建 10k 線程 → 內存耗盡(1線程≈1MB棧)

  3. 上下文切換開銷大(微秒級)

  4. 阻塞操作浪費 CPU 資源

一、如何創建虛擬線程

1. 直接創建

?// 1. 使用靜態方法 `Thread.startVirtualThread(Runnable)Thread.startVirtualThread(new Runnable() {@Overridepublic void run() {System.out.println("Hello, Virtual Thread!");}});//2.(推薦使用)使用構建器模式 `Thread.ofVirtual().name("name").start(Runnable)// name方法// - 第一個參數 `"vt-"` 是名稱前綴。//- 第二個參數 `1` 是起始序號。//- 實際生成的線程名稱將是 `"vt-1"`、`"vt-2"`、`"vt-3"` 等,每次創建一個新線程時序號自動增加。Thread vt = Thread.ofVirtual().name("vt-", 1).start(() -> {System.out.println("Running in virtual thread");});
2. 線程池(推薦)
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {for (int i = 0; i < 100_000; i++) {executor.submit(() -> {// 處理請求(含I/O阻塞)return processRequest();});}
} // 自動關閉

核心區別對比表

特性傳統線程(平臺線程)虛擬線程
與OS關系1:1 綁定(直接對應OS線程)M:N?映射(JVM管理)
內存開銷約 1MB/線程(默認棧大小)約 200B-2KB/線程
創建數量上限通常數千個數百萬個
創建速度毫秒級(涉及OS調用)微秒級(純JVM操作)
阻塞成本整個OS線程被阻塞僅虛擬線程暫停,載體線程釋放
調度器操作系統內核JVM(用戶態)
上下文切換內核介入,開銷大(微秒級)JVM管理,開銷極小(納秒級)
典型使用場景new Thread()?或固定大小線程池Thread.ofVirtual().start()?或虛擬線程池

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

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

相關文章

掌握系統設計的精髓:12個核心設計模式的通俗解讀

在構建復雜且高可用的軟件系統時&#xff0c;僅僅了解編程語言和算法是不夠的。真正的挑戰在于如何設計出能夠應對并發、故障、擴展等各種問題的健壯架構。系統設計模式正是前輩們在無數實踐中提煉出的智慧結晶&#xff0c;它們是解決常見系統問題的“最佳實踐”。 本文將深入淺…

概率論與數理統計(二)

事件的概率 概率&#xff1a;可能性的大小 古典概率模型&#xff1a; 1&#xff09;有限個樣本點 2&#xff09;等可能性 P(A)A中包含的基本事件數基本事件總和 P(A) \frac{A中包含的基本事件數}{基本事件總和} P(A)基本事件總和A中包含的基本事件數? 頻率與概率 nnn 次實驗…

新型eSIM攻擊技術可克隆用戶資料并劫持手機身份

eSIM技術存在重大安全漏洞研究人員發現eSIM技術中存在一個關鍵漏洞&#xff0c;攻擊者可利用該漏洞克隆移動用戶資料并劫持手機身份。AG安全研究團隊宣布&#xff0c;他們成功攻破了采用GSMA消費者證書的Kigen eUICC&#xff08;嵌入式通用集成電路卡&#xff09;安全防護&…

langchain教程2:更加高級和靈活的Prompt模板

文章目錄 prompt模板 對話Prompt模板 函數大師 使用jinja2與f-string實現提示詞模板格式化 組合式提示詞模板 prompt模板 from langchain.prompts import PromptTemplateprompt = PromptTemplate.from_template("你是一個{name},幫我起一個具有{country}特色的{gender}名…

UE5使用Motion Warping有什么用?

在 UE5 中&#xff0c;Motion Warping 是一套用于「動態調整根運動動畫」的系統插件&#xff0c;它能讓帶有根運動&#xff08;Root Motion&#xff09;的動畫根據游戲運行時的環境自動變形&#xff08;Warp&#xff09;&#xff0c;以更精準地貼合目標位置或目標方向&#xff…

類模版的相關案例

案例實現&#xff1a;實現一個通用的數組類&#xff0c;要求如下&#xff1a;可以對內置數據類型以及自定義數據類型的數據進行存儲將數組中的數據存儲到堆區構造函數中可以傳入數組的容量提供對應的拷貝構造函數以及operator防止淺拷貝問題提供尾插法和尾刪法對數組中的數據進…

服務器端安全檢測與防御技術概述

一、服務器安全風險1.不必要的訪問&#xff08;如只提供HTTP服務&#xff09;--應用識別控制2.公網發起IP或端口掃描、DDOS攻擊等--防火墻3.漏洞攻擊&#xff08;針對服務器操作系統等&#xff09;--IPS4.根據軟件版本的已知漏洞進行攻擊&#xff0c;口令暴力破解、獲取用戶權限…

前端性能與可靠性工程系列: 渲染、緩存與關鍵路徑優化

前端性能與可靠性工程系列: 渲染、緩存與關鍵路徑優化 第一部分:揭秘瀏覽器 - 關鍵渲染路徑 (CRP) 關鍵渲染路徑 (Critical Rendering Path - CRP) 是指瀏覽器從接收到最初的 HTML、CSS 和 JavaScript 字節,到最終將它們渲染成可見像素所必須經過的一系列步驟。我們的目標,…

基于CentOS的分布式GitLab+Jenkins+Docker架構:企業級CI/CD流水線實戰全記錄

引言&#xff1a;從單機到分布式容器架構的演進在傳統Web應用部署中&#xff0c;我們常常面臨環境不一致、部署效率低下等問題。我曾經維護過一個需要手動在5臺服務器上重復部署的游戲項目&#xff0c;每次發布都如同走鋼絲。本文將詳細分享如何基于CentOS系統&#xff0c;構建…

JVM——為什么Java8移除了永久代(PermGen)并引入了元空間(Metaspace)?

Java8移除永久代并引入元空間&#xff0c;主要是為了解決 PermGen 固定大小、容易導致內存溢出、GC 效率低的問題。元空間使用本地內存&#xff0c;具備更靈活的內存分配能力&#xff0c;提升了垃圾收集和內存管理的效率。 PermGen 的局限性 ①固定大小:永久代的內存空間大小在…

3.正則化——新聞分類

影響結果出了最終的目標&#xff0c;還會有許多細節因素 在機器學習中&#xff0c;往往會面臨很多過擬合和欠擬合的問題。 欠擬合是訓練不到位&#xff0c;過擬合是訓練過頭&#xff0c;會導致泛化性差正則化是在損失函數中添加一個懲罰項&#xff0c;以簡化模型對于懲罰項Pena…

HTML的重要知識

什么是HTMLHTML是Hyper Text Markup Language的縮寫&#xff0c;意思是超文本標記語言。標簽標題標簽&#xff1a;————-h1,h2,h3.....段落標簽 &#xff1a;————p換行標簽&#xff1a; ————br列表標簽&#xff1a;有序列表&#xff1a;——ol無序列表&#xff1a;—…

【C語言網絡編程】HTTP 客戶端請求(發送請求報文過程)

在 C 語言中&#xff0c;我們可以使用 socket 編程來手動實現一個簡單的 HTTP 客戶端&#xff0c;像瀏覽器一樣請求網頁數據。本文將結合實際代碼&#xff0c;重點講解如何通過 C 語言構造并發送一個 HTTP 請求報文&#xff0c;實現與服務器的基本通信。 文章目標 通過一個簡單…

oracle2kingbase的字段長度問題

實驗一&#xff1a; oracle中&#xff1a; create table testlen(c1 varchar2(2)); insert into testlen values(山); --成功 insert into testlen values(山西); --失敗 ORA-12899: 列 "TESTK"."TESTLEN"."C1" 的值太大 (實際值: 4, 最大值: 2…

單鏈表的題目,咕咕咕

1.咕 203. 移除鏈表元素 - 力扣&#xff08;LeetCode&#xff09; 給你一個鏈表的頭節點 head 和一個整數 val &#xff0c;請你刪除鏈表中所有滿足 Node.val val 的節點&#xff0c;并返回 新的頭節點 struct ListNode* removeElements(struct ListNode* head, int val) …

關于程序=數據結構+算法這句話最近的一些思考

最近看了很多單片機STM32的的相關程序&#xff0c;尤其是設計到ringbuff、buffer_manage、os_memory預計mem_manage等程序中間層的用法&#xff0c;我對這句話有了一些更深的思考&#xff0c;現在記錄下來&#xff0c;希望對處于相同階段的程序一些思想啟迪。首先“數據結構”也…

Rust 錯誤處理

Rust 錯誤處理 引言 Rust 是一種系統編程語言&#xff0c;以其安全、并發和性能著稱。在 Rust 中&#xff0c;錯誤處理是一個核心概念&#xff0c;它確保了程序在遇到異常情況時能夠優雅地處理。本文將深入探討 Rust 中的錯誤處理機制&#xff0c;包括錯誤類型、錯誤傳播、錯誤…

17. 什么是 webSocket ?

總結 WebSocket 是 HTML5 引入的一種新協議&#xff0c;允許客戶端和服務器之間進行雙向實時通信。建立在 TCP 協議之上&#xff0c;默認端口是 80&#xff08;ws&#xff09; 和 443&#xff08;wss&#xff09;&#xff0c;沒有同源限制&#xff0c;客戶端可以與任意服務器通…

從零開始跑通3DGS教程:(五)3DGS訓練

寫在前面 本文內容 所屬《從零開始跑通3DGS教程》系列文章; 本文介紹在docker中訓練3dgs的方法 平臺/環境 linux, nvidia GPU, docker 轉載請注明出處: https://blog.csdn.net/qq_41102371/article/details/146535874 目錄 寫在前面系列文章準備docker創建環境參考完系列文章…

日記_7.14_實際開發的進步

1、快速定位后端2、會定位前端啦啦啦&#xff01;3、前端沒有意義的塊叫div和span。而不是script4、所有 JavaScript 標識符均 區分大小寫5、JS中$和_下劃線和doller符均被視為字母。6、var、let區別&#xff1a;1 var全局。let局部。2 var可以重新聲明格式&#xff0c;let之恩…