Java NIO Java 虛擬線程(微線程)與 Go 協程的運行原理不同 為何Go 能在低配機器上承接10萬 Websocket 協議連接

什么是Java NIO?

Java NIO(New Input/Output) 是Java 1.4(2002年)引入的一種非阻塞、面向緩沖區的輸入輸出框架,旨在提升Java在高性能和高并發場景下的I/O處理能力。它相比傳統的 Java IO(java.io包)更加高效,尤其在網絡編程中,例如需要處理大量連接的服務器(如WebSocket、HTTP或TCP服務器)。

Java NIO的核心組件

  • Channel(通道):類似傳統IO中的流,但支持非阻塞操作,例如SocketChannel和ServerSocketChannel。

  • Buffer(緩沖區):高效的數據容器,如ByteBuffer,用于讀寫數據。

  • Selector(選擇器):實現多路復用,允許一個線程監控多個通道的事件(如連接建立、數據可讀、可寫)。

  • Asynchronous Channel(異步通道)(Java 7+):如AsynchronousSocketChannel,提供真正的異步I/O支持。

Java NIO的優勢

  • 非阻塞I/O:一個線程可以處理多個連接,不必為每個連接分配獨立線程。

  • 多路復用:通過Selector,一個線程可以管理成千上萬的連接,減少線程開銷。

  • 高效性:Buffer優化了數據傳輸,減少了內存拷貝。

  • 適用場景:特別適合WebSocket這種需要維持大量長連接的協議。

簡單來說,Java NIO通過非阻塞和多路復用技術,為高并發網絡應用提供了強大的支持。


在沒有NIO之前,Java如何處理類似WebSocket協議下的10萬連接?

背景說明:WebSocket協議是2011年才標準化(RFC 6455),而Java NIO早在2002年就已推出。因此,在沒有NIO之前(即Java 1.4之前),并不存在WebSocket協議。但我們可以假設問題是指“類似WebSocket的高并發長連接場景”,例如基于TCP的自定義協議或HTTP長輪詢。

在沒有NIO的情況下,Java使用的是 傳統Java IO(java.io包)和 線程-per-連接(thread-per-connection) 模型來處理網絡連接。

傳統Java IO的特點

  • 阻塞式I/O:每個連接的讀寫操作都是阻塞的,線程在I/O完成前無法處理其他任務。

  • 線程-per-連接模型:為每個客戶端連接分配一個獨立線程,線程負責該連接的所有I/O操作和業務邏輯。

處理10萬連接的挑戰

如果要支持10萬并發連接,每個連接一個線程,會遇到以下問題:

  • 內存開銷:每個Java線程默認棧內存約1MB(可通過-Xss調至256KB)。10萬線程需要約100,000 * 256KB = 25GB的棧內存,加上JVM堆內存和緩沖區,總內存需求可能達到35-45GB。

  • CPU負擔:10萬線程會導致頻繁的上下文切換,CPU利用率下降,延遲增加。

  • 系統限制:操作系統對線程數和文件描述符有限制(如Linux默認線程數上限幾千到幾萬,文件描述符默認1024),需要大幅調整配置。

  • 性能瓶頸:線程調度和資源競爭使服務器性能隨連接數增加而快速下降。

當時的解決方案

在沒有NIO的情況下,開發者可能會嘗試以下方法,但效果有限:

  • 線程池:用固定大小的線程池處理連接,但并發數受限于線程池大小,超出的連接只能排隊或被拒絕。

  • 多進程:啟動多個進程分擔連接,但進程間通信復雜,資源利用率低。

  • 手動異步:通過復雜邏輯實現偽異步,但開發難度高且不穩定。

總之,在傳統Java IO下,處理10萬連接極其困難,幾乎不可行。


在沒有NIO之前,支持10萬連接需要多少硬件支持?

在傳統線程-per-連接模型下,支持10萬連接對硬件要求極高,以下是估算:

硬件需求分析

  1. 內存:

    • 每個線程棧內存:假設-Xss256k,即256KB。

    • 10萬線程:100,000 * 256KB ≈ 25GB。

    • 額外開銷:JVM堆內存、連接緩沖區等,約10-20GB。

    • 總內存:35-45GB。

  2. CPU:

    • 10萬線程的上下文切換需要大量CPU資源。

    • 假設連接活性較低,CPU利用率可能在50-80%。

    • 建議配置:8-16核CPU,甚至更高。

  3. 網絡帶寬:

    • 假設每個連接平均1KB/s(低活性),總帶寬為100,000 * 1KB/s = 100MB/s ≈ 800Mbps。

    • 網卡:至少1Gbps。

  4. 操作系統調整:

    • 文件描述符:每個連接占用一個,需設置ulimit -n為100,000+。

    • 線程上限:調整Linux的/proc/sys/kernel/threads-max。

具體硬件配置

  • 單機:高配服務器,例如32-64核CPU,64GB+內存,1Gbps網卡。

  • 多機集群:單機難以承受10萬線程,需10臺服務器,每臺處理1萬連接(每臺約16GB內存、8核CPU)。

  • 成本:硬件和運維成本極高,且性能不佳(延遲高、穩定性差)。

可行性

即使硬件能支持,10萬線程的調度開銷和內存壓力會導致系統效率低下。在沒有NIO的時代,Java并不適合這種超高并發場景,開發者可能會轉向其他語言(如C的epoll)。


NIO的改進(補充說明)

相比之下,Java NIO通過非阻塞I/O和Selector多路復用,極大降低了資源需求:

  • 線程數:只需少量線程(例如8-16個),內存降至幾GB。

  • 硬件:普通服務器(4-8核CPU、8-16GB內存)即可支持10萬連接。

  • 效率:性能提升數倍,成本大幅降低。

阿里巴巴的NIO使用

證據顯示,阿里巴巴使用Netty框架(基于Java NIO)來管理數十億連接,適合雙11近1億人同時發起請求的場景。

具體實現細節未公開,但NIO的多路復用和非阻塞特性似乎是關鍵。

阿里巴巴的電商平臺如淘寶和天貓在雙11期間需要處理數十億請求,這需要高度可擴展的架構。Java NIO通過非阻塞I/O和選擇器(Selectors)允許多個連接由少量線程管理,非常適合這種高并發場景。

技術使用

  • Java NIO的作用:NIO通過選擇器監控多個通道(連接),一個線程可以處理成千上萬的連接,減少線程開銷。

  • Netty框架:阿里巴巴使用Netty(基于NIO)來構建高性能網絡服務器,Netty支持多線程事件循環和高效內存管理,適合雙11的高并發需求。

Go 協程和Netty的事件循環差異

Netty 的事件循環

Netty 是一個基于 Java NIO 的網絡框架,其事件循環(Event Loop)采用 Reactor 模式。一個 EventLoop 由一個線程管理,通過選擇器(Selector)監控多個連接(Channel),處理 I/O 事件(如數據可讀、可寫)。它特別適合高并發場景,如 WebSocket 服務器,一個線程能處理成千上萬的連接。

Go 協程的事件循環

Go 的 goroutine 是輕量級并發單元,由 Go 運行時管理,事件循環是隱式的。當 goroutine 執行 I/O 操作時,如果阻塞,運行時會自動掛起該 goroutine,調度其他 goroutine 運行。Go 適合 CPU 和 I/O 混合任務,易于開發高并發網絡服務。

主要區別

  • 線程模型:Netty 用單線程 EventLoop 處理多個 Channel,Go 用多個 OS 線程調度 goroutine。

  • I/O 處理:Netty 使用非阻塞 I/O,Go goroutine 可阻塞,運行時自動管理。

  • 適用場景:Netty 優化高并發網絡,Go 適合通用并發任務。

Netty和Java虛擬線程之間的關系

研究表明,Netty 和 Java 虛擬線程在高并發網絡應用中有潛在的互補關系,但目前 Netty 尚未完全支持虛擬線程。

Netty 的作用:Netty 是一個基于 Java NIO 的高性能網絡框架,適合處理大量連接。

虛擬線程的優勢:Java 虛擬線程(從 Java 21 開始正式支持)是輕量級線程,能簡化高并發編程,減少資源消耗。

兩者結合:虛擬線程可以與 Netty 一起使用,可能簡化開發,但需要社區進一步支持。

Netty 是一個異步事件驅動的網絡框架,擅長處理高并發場景,如 WebSocket 服務器。它使用少量線程通過事件循環管理大量連接,適合需要高性能的網絡應用。

Java 虛擬線程允許創建數百萬個輕量級線程,特別適合 I/O 密集型任務。當線程阻塞時,JVM 會自動掛起它,釋放資源,適合高吞吐量應用。

Netty 是虛擬線程出現前的過渡產品?

研究表明,Netty 在 Java 虛擬線程出現前確實是一種過渡性解決方案,主要解決平臺線程在高并發場景下的問題。

Netty 基于 Java NIO,提供非阻塞 I/O 和事件驅動模型,適合處理大量連接。

虛擬線程(從 Java 21 開始)簡化了高并發編程,可能是未來更直接的解決方案,但 Netty 仍具價值。

Netty 是一個高性能網絡框架,設計用于處理高并發網絡任務,如 WebSocket 服務器。它通過少量線程管理大量連接,解決了平臺線程資源開銷大的問題。

Java 虛擬線程允許創建輕量級線程,適合高并發場景,減少了資源消耗。它們讓開發者可以用阻塞式代碼處理高并發,簡化了開發。

在虛擬線程出現前,Netty 是處理高并發的關鍵工具。現在,虛擬線程可能減少對 Netty 的依賴,但 Netty 在特定場景(如復雜網絡協議)仍很重要。

虛擬線程與Go協程在低配機器上處理10萬連接的區別

研究表明,Go協程在低配機器上處理10萬連接更具優勢,主要是內存開銷低和運行時高效。

Java虛擬線程也適合高并發,但JVM的開銷可能在低配機器上成為瓶頸。

兩者的區別在于內存使用、CPU效率和生態系統,Go更適合資源有限的場景。

內存使用

Go協程每個約2KB內存,10萬連接需200MB,適合低配機器(如2GB內存)。Java虛擬線程內存開銷低,但JVM可能需1.5GB以上,資源緊張時表現不如Go。

CPU和調度效率

Go的調度器用戶態實現,效率高,適合低配CPU。Java虛擬線程依賴JVM,調度開銷稍高,低配CPU可能受GC影響。

實際表現

測試顯示Go在低配機器上處理10萬連接更高效,Java虛擬線程在高端硬件上更強,但低配場景可能受限。

?為什么在高端硬件上虛擬線程表現會比Go好?

CPU密集型任務:Java的即時編譯器(JIT)能針對高端硬件生成高度優化的機器代碼,利用多核和高級指令集(如AVX-512),提升性能。例如,科學計算中的矩陣運算可能受益于此。

復雜計算和生態系統整合:Java有成熟的庫(如Apache Spark、TensorFlow),虛擬線程能高效并發執行這些庫的任務,同時利用JVM的優化。

高內存分配場景:Java的高級垃圾回收(如G1、ZGC)在高端硬件上能高效處理高內存分配,適合長運行應用。

例如,在一個需要復雜計算和大量并發的科學計算應用中,虛擬線程可能比Go協程更快,因為JVM能更好地利用高端硬件的資源。

Go協程的優勢

但需要注意的是,Go協程在高并發I/O任務中通常表現更優,特別是在需要快速創建大量任務時(如Web服務器)。Go的運行時更簡單,內存開銷低(每個Goroutine約2KB),在某些基準測試中(如處理100萬任務),Go比Java虛擬線程快(4.911秒 vs. 10.73秒)。

總結

總體來說,虛擬線程在高端硬件上可能在特定CPU密集型或生態系統依賴的場景下表現更好,但Go協程在一般高并發任務中更高效。選擇哪種技術取決于具體應用需求和開發者的熟悉程度。

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

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

相關文章

go環境安裝mac

下載go安裝包:https://golang.google.cn/dl/ 找到對應自己環境的版本下載。 注意有二進制的包,也有圖形界面安裝的包。圖形界面直接傻瓜式點就行了。 二進制的按照下面操作: 1、下載二進制包。 2、將下載的二進制包解壓至 /usr/local目錄…

LVGL源碼(9):學會控件的使用(自定義彈窗)

LVGL版本:8.3 LVGL的控件各式各樣,每種控件都有自己的一些特性,當我們想要使用一個LVGL控件時,我們首先可以通過官網去了解控件的一些基本特性,官網鏈接如下: LVGL Basics — LVGL documentation&#xf…

《軟件設計師》復習筆記(1)——考試介紹【新】

目錄 一、考試介紹 證書價值 考試要求 二、【新】計算機與軟件工程知識 三、軟件設計 一、考試介紹 >考試科目>考題形式>考試時長>合格標準計算機與軟件工程知識75道單選題(每題1分,總分75分)2023年11月改革機試后&#…

MCU中的BSS和data都占用SRAM空間嗎?

在MCU中,BSS段和data段都占用SRAM空間,但它們的存儲方式和用途有所不同。? BSS段 BSS段(Block Started by Symbol)用于存儲未初始化的全局變量和靜態變量。這些變量在程序啟動時會被清零,因此它們不占用Flash空間&a…

Ubuntu 22.04 更換 Nvidia 顯卡后啟動無法進入桌面問題的解決

原顯卡為 R7 240, 更換為 3060Ti 后, 開機進桌面時卡在了黑屏界面, 鍵盤有反應, 但是無法進入 shell. 解決方案為 https://askubuntu.com/questions/1538108/cant-install-rtx-4060-ti-on-ubuntu-22-04-lts 啟動后在開機菜單中(如果沒有開機菜單, 需要按shift鍵), 進入recove…

Python爬蟲-爬取貓眼演出數據

前言 本文是該專欄的第53篇,后面會持續分享python爬蟲干貨知識,記得關注。 貓眼平臺除了有影院信息之外,它還涵蓋了演出信息,比如說“演唱會,音樂節,話劇音樂劇,脫口秀,音樂會,戲曲藝術,相聲”等等各種演出相關信息。 而本文,筆者將以貓眼平臺為例,基于Python爬蟲…

人工智能-機器學習(線性回歸,邏輯回歸,聚類)

人工智能概述 人工智能分為:符號學習,機器學習。 機器學習是實現人工智能的一種方法,深度學習是實現機器學習的一種技術。 機器學習:使用算法來解析數據,從中學習,然后對真實世界中是事務進行決策和預測。如垃圾郵件檢…

FPGA學習(五)——DDS信號發生器設計

FPGA學習(五)——DDS信號發生器設計 目錄 FPGA學習(五)——DDS信號發生器設計一、FPGA開發中常用IP核——ROM/RAM/FIFO1、ROM簡介2、ROM文件的設置(1)直接編輯法(2)用C語言等軟件生成初始化文件 3、ROM IP核配置調用 二、DDS信號發…

【Vue】從 MVC 到 MVVM:前端架構演變與 Vue 的實踐之路

個人博客:haichenyi.com。感謝關注 一. 目錄 一–目錄二–架構模式的演變背景?三–MVC:經典的分層起點?四–MVP:面向接口的解耦嘗試?五–MVVM:數據驅動的終極形態??六–Vue:MVVM 的現代化實踐??? 二. 架構模…

【算法】快速排序、歸并排序(非遞歸版)

目錄 一、快速排序&#xff08;非遞歸&#xff09; 1.原理 2.實現 2.1 stack 2.2 partition(array,left,right) 2.3 pivot - 1 > left 二、歸并排序&#xff08;非遞歸&#xff09; 1.原理 2.實現 2.1 gap 2.1.1 i 2*gap 2.1.2 gap * 2 2.1.3 gap < array.…

CasualLanguage Model和Seq2Seq模型的區別

**問題1&#xff1a;**Causal Language Modeling 和 Conditional Generation 、Sequence Classification 的區別是什么&#xff1f; 因果語言模型(Causal Language Model)&#xff1a; 預測給定文本序列中的下一個字符&#xff0c;一般用于文本生成、補全句子等&#xff0c;模型…

【計算機視覺】三維視覺項目 - Colmap二維圖像重建三維場景

COLMAP 3D重建 項目概述項目功能項目運行方式1. 環境準備2. 編譯 COLMAP3. 數據準備4. 運行 COLMAP 常見問題及解決方法1. **編譯問題**2. **運行問題**3. **數據問題** 項目實戰建議項目參考文獻 項目概述 COLMAP 是一個開源的三維重建軟件&#xff0c;專注于 Structure-from…

狀態管理最佳實踐:Bloc架構實踐

狀態管理最佳實踐&#xff1a;Bloc架構實踐 引言 Bloc (Business Logic Component) 是Flutter中一種強大的狀態管理解決方案&#xff0c;它基于響應式編程思想&#xff0c;通過分離業務邏輯和UI表現層來實現清晰的代碼架構。本文將深入探討Bloc的核心概念、實現原理和最佳實踐…

Python多任務編程:進程全面詳解與實戰指南

1. 進程基礎概念 1.1 什么是進程&#xff1f; 進程(Process)是指正在執行的程序&#xff0c;是程序執行過程中的一次指令、數據集等的集合。簡單來說&#xff0c;進程就是程序的一次執行過程&#xff0c;它是一個動態的概念。 想象你打開電腦上的音樂播放器聽歌&#xff0c;…

Linux 網絡基礎(二) (傳輸協議層:UDP、TCP)

目錄 一、傳輸層的意義 二、端口號 1、五元組標識一個通信 2、端口號范圍劃分 3、知名端口號&#xff08;Well-Know Port Number&#xff09; &#xff08;1&#xff09;查看端口號 4、綁定端口號數目問題 5、pidof & netstat 命令 &#xff08;1&#xff09;ne…

得佳勝哲訊科技 SAP項目啟動會:膠帶智造新起點 數字轉型新征程

在全球制造業加速向數字化、智能化轉型的浪潮中&#xff0c;膠帶制造行業正迎來以“自動化生產、數據化運營、智能化決策”為核心的新變革。工業互聯網、大數據分析與智能裝備的深度融合&#xff0c;正推動膠帶制造從傳統生產模式向“柔性化生產精準質量控制全鏈路追溯”的智慧…

大數據學習棧記——MapReduce技術

本文介紹hadoop中的MapReduce技術的應用&#xff0c;使用java API。操作系統&#xff1a;Ubuntu24.04。 MapReduce概述 MapReduce概念 MapReduce是一個分布式運算程序的編程框架&#xff0c;核心功能是將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分布式運算程序…

Centos9 離線安裝 MYSQL8

centos 9 離線安裝 mysql 8 參考教程 1. 官網下載mysql 下載地址 2. 將文件傳輸到Centos中解壓 軟件全部安裝到了/opt中 在opt中新建mysql目錄&#xff0c;解壓到mysql目錄中 tar -xvf mysql壓縮文件 mysql[rootcentoshost mysql]# ls mysql-community-client-8.4.5-1.e…

helm的go模板語法學習

1、helm chart 1.0、什么是helm&#xff1f; 介紹&#xff1a;就是個包管理器。理解為java的maven、linux的yum就好。 安裝方法也可參見官網&#xff1a; https://helm.sh/docs/intro/install 通過前面的演示我們知道&#xff0c;有了helm之后應用的安裝、升級、查看、停止都…

display的一些學習記錄

收集的SDM的log&#xff1a; 01-01 00:00:15.311 933 933 I SDM : Creating Display HW Composer HAL 01-01 00:00:15.311 933 933 I SDM : Scheduler priority settings completed 01-01 00:00:15.311 933 933 I SDM : Configuring RPC threadpool 0…