成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

受”誤解“的Java AIO

開發 后端
為什么說 AIO 受”誤解“,雖然這個”誤解“被打上了雙引號,但還是不得不承認它的發展狀況并不好。AIO 是 Java 7 開始提供的新特性,而這個”新特性“到如今都成了陳年老酒還鮮有人去品味它。

 為什么說 AIO 受”誤解“,雖然這個”誤解“被打上了雙引號,但還是不得不承認它的發展狀況并不好。AIO 是 Java 7 開始提供的新特性,而這個”新特性“到如今都成了陳年老酒還鮮有人去品味它。要知道 Java 7 可是在 2011年7月份發布的,市面上基于 AIO 實現的通信框架竟然寥寥無幾,關于這項技術的介紹文章也普遍比較粗略。通過閱讀那些介紹 AIO 的文章,似乎從學術層面大家就不怎么待見這項技術。

[[313059]]

作為 AIO 的學習者、受益者,我覺得有必要先對網上的一些 ”偏見“ 表達一下自己的觀點。如果能有幸在認知上搭成共識,之后的學習交流會更加順暢一點。通常偏見源于比較,AIO 與 BIO、NIO 的對比明細如表所示。

 

受”誤解“的Java AIO

 

誤解一

通過上表的比較可以看出 AIO 的性價比應該是優于 NIO 的,而實際情況卻是大多數人更偏愛與 NIO,準確的說應該是偏愛 NIO 通信框架:Netty。這本無可厚非,Netty 確實是一款非常優秀的項目,可是很多人錯誤的解讀了 Netty 在 Github 上關于不支持 AIO 的理由,這更加遏制了 AIO 的發展。

Not faster than NIO (epoll) on unix systems (which is true)

這句話表達的本意應該是:NIO 和 AIO 在 unix 系統上使用的都是 epoll 模式,本質都是一樣的。但Not faster than NIO在一定程度上會讓人誤解為 AIO 沒 NIO 快。 這里可以采用假設的方式來論證這個觀點是不成立的。

假設:

epoll 表現的性能為 x=100;

通信框架因為要解決并發調度與資源分配問題,對 epoll 進行封裝后會存在一定的性能損耗,以 y 表示。

最終性能表現結果應該是 r=x-y。

論證:

某款 NIO 框架基于 epoll 封裝后的性能損耗值:y=5,則它所發揮的最終性能為:x-y=95。

如果有一款 AIO 框架能將性能損耗值控制在:y=(0,5) ,那最終性能便高于 NIO 框架。如 y>5,則性能低于 NIO 框架。

結論:

以底層模型是 kqueue、epoll、select 還是 IOCP 來比較 NIO 和 AIO 的性能是不嚴謹的,決定權在于框架實現能挖掘出多少基礎能力。否則同樣采用 NIO 技術,為什么不同的框架還是會有高低之分。

誤解二

Linux 系統的 AIO 還不成熟。如果是這個原因的話,不妨先看下:http://lse.sourceforge.net/io/aio.html,其中核心的一句話:Support for kernel AIO has been included in the 2.6 Linux kernel.請注意,Linux 內核自 2.6 版本起已支持AIO模式。

這是個很奇怪的現象,似乎曾經不支持 AIO 就覺得永遠不支持,曾經出現的 bug 就永遠存在。正如 JAVA NIO 的空輪訓 bug ,如今都已經發展到 Java 13 了,依舊還有人堅信這個 bug 一直在。坦白的講,我沒有去驗證過 Java AIO 在 Linux 環境下是否是真正意義的 AIO,也沒有復現出 NIO 的空輪訓 bug。但如果因為某種原因放棄持續學習,那對于事物的認知和見識就只能停留在過去。

所以”Linux 系統的 AIO 還不成熟“也不會成為我拋棄 AIO 的理由。

誤解三

需要為每一個連接預先分配讀緩存。這個確實是客觀存在的情況,AIO 的使用方式是調用讀寫接口將ByteBuffer對象注冊進去,當事件完成后以回調的形式觸發CompletionHandler,所以必須要事先分配好緩存空間。

但是有一個細節可能會被大家忽略掉,即便采用 NIO,當遇到半包/粘包的的情況,還是需要有一個緩存對象來暫存這份不完整的數據。尤其在高并發場景下,半包/粘包現象很容易加劇,此時 NIO 需要分配的緩存并不比 AIO 節省多少。

即使假設理想狀態下并不存在半包/粘包問題,AIO 通信的預分配形式又能額外消耗多少內存。為每個連接分配 1024 字節的讀緩存,在1萬個并發連接的條件下也才消耗不到 10MB 內存,試問現實場景下一臺 Java 應用服務器需要同時支撐多少個并發,1萬?5萬?10萬?。

目前已知的通信框架通常會配備內存池,在這種前提下 AIO 也只是將內存池中的資源提前利用起來而已。在同等的內存池配置,相同的并發壓力下,如果 AIO 暴露出內存方面的問題,我們再來做 AIO 和 NIO 的選擇。

總結

本文并不是要將 NIO 和 AIO 對立起來,這兩項技術都非常吸引人,喜歡技術的朋友可以在這方面鉆研很久。個人推薦純粹出于學習優先考慮 NIO,因為難度更高,更具挑戰性,將要面臨和需要解決的問題更多。在學習的過程中如果遇到困惑,可以再去翻一下 AIO 的源碼,里面有很多值得借鑒的設計。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-02-17 18:32:42

JavaAIOIO

2011-12-15 11:39:25

JavaNIO

2016-10-26 10:11:37

2021-06-11 17:26:06

代碼Java網絡編程

2018-06-26 05:57:58

多云云計算公共云

2012-09-21 09:21:44

函數式編程函數式語言編程

2021-04-14 09:43:57

微服務拆分業務

2020-04-16 15:20:43

PHP前端BIO

2022-04-16 16:52:24

Netty網絡服務器客戶端程序

2022-01-24 17:05:12

Java程序員工具

2015-04-21 11:33:37

JavaJava垃圾回收

2021-08-14 22:29:42

Backstab進程安全工具

2022-03-25 09:44:55

開源軟件

2015-03-31 10:41:51

Sirius開源虛擬助手

2018-05-21 10:30:45

CIO

2019-10-16 16:56:16

小程序BAT微信

2013-08-23 10:42:03

Hadoop

2017-10-10 17:00:11

SparkHadoop數據處理

2023-05-31 11:51:01

微服務數量代碼

2021-12-29 06:30:12

安全工具網絡安全CISO
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人精品 | 久久免费福利 | 成人国产精品久久久 | 91精品久久久久久久久久 | 亚洲成人网在线播放 | 91国产视频在线观看 | av色噜噜| 欧美视频成人 | www.888www看片| 亚洲精品女优 | 亚洲中午字幕 | 日韩精品一区二区在线观看 | 91麻豆精品国产91久久久更新资源速度超快 | 国产高清久久 | 亚洲精品一区二区三区四区高清 | 日本在线综合 | 国产一区二区三区日韩 | 天天射网站 | 国产精品成人国产乱一区 | 日韩中文字幕视频在线观看 | 青青操91 | 久久午夜精品福利一区二区 | 国产一区二区免费在线 | 欧美激情精品久久久久久 | 99精品电影| 精品一区电影 | 一区二区三区四区电影视频在线观看 | 久久久www成人免费无遮挡大片 | 亚洲综合色网 | www中文字幕 | 国产一区二区三区四区五区加勒比 | 一级片视频免费观看 | 超级黄色一级片 | 国产成人精品一区二区三区四区 | 亚洲国产欧美91 | 美女高潮网站 | 精品视频久久久久久 | 欧美日本韩国一区二区 | 亚洲男人的天堂网站 | 精品久久久久久久久久久久久久 | 亚洲人成在线观看 |