日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

阿里面試:NIO為什么會導致CPU100%?

來源: 責編: 時間:2024-05-27 17:22:19 134觀看
導讀在 Java 中總共有三種 IO 類型:BIO(Blocking I/O,阻塞I/O)、NIO(Non-blocking I/O,非阻塞I/O)和 AIO(Asynchronous I/O,異步I/O),它們的區別如下:在 JDK 1.4 之前,只有 BIO 一種模式,其開發過程相對簡單,新來一個連接就會創建一個新

在 Java 中總共有三種 IO 類型:BIO(Blocking I/O,阻塞I/O)、NIO(Non-blocking I/O,非阻塞I/O)和 AIO(Asynchronous I/O,異步I/O),它們的區別如下:zGT28資訊網——每日最新資訊28at.com

  1. 在 JDK 1.4 之前,只有 BIO 一種模式,其開發過程相對簡單,新來一個連接就會創建一個新的線程處理,但隨著請求并發度的提升,BIO 很快遇到了性能瓶頸。
  2. 所以在 JDK 1.4 以后開始引入了 NIO 技術,NIO 可以在一個線程中處理多個 IO 操作,提高了資源的利用率和系統的吞吐量。
  3. 而到了 JDK 1.7 發布了 AIO 模型,它可以實現當線程發起一個 IO 操作后,可以直接返回,無需等待 IO 操作完成。操作系統會在整個 IO 操作完成后,通過回調函數通知應用程序。

1.空輪詢和CPU100%

然而,隨著 NIO 逐漸使用,人們卻發現了 NIO 的一個經典問題,也就是臭名昭著的 Epoll(多路復用實現技術)空輪詢的問題。zGT28資訊網——每日最新資訊28at.com

空輪詢的問題是指,在 Linux 系統下,使用 Java 中的 NIO 時,即使 Selector(多路復用器)輪詢結果為空,也沒有 wakeup 或新消息要處理時,NIO 依舊會進行空輪詢,導致 CPU 一直上升,最終造成 CPU 使用率 100% 的問題。zGT28資訊網——每日最新資訊28at.com

該 BUG 相關可以參見以下鏈接:zGT28資訊網——每日最新資訊28at.com

  • https://bugs.java.com/bugdatabase/view_bug.do?bug_id=2147719
  • https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6403933
  • https://github.com/netty/netty/issues/327

2.空輪詢的原因

空輪詢產生的原因可以在 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6670302 上找到答案,例如以下就是一個經典的 bug 復現場景:zGT28資訊網——每日最新資訊28at.com

A DESCRIPTION OF THE PROBLEM :The NIO selector wakes up infinitely in this situation..0. server waits for connection1. client connects and write message2. server accepts and register OP_READ3. server reads message and remove OP_READ from interest op set4. client close the connection5. server write message (without any reading.. surely OP_READ is not set)6. server's select wakes up infinitely with return value 0

也就說,當連接出現了 RST(強制連接關閉),因為 poll 和 epoll 對于突然中斷的連接 Socket 會對返回的 eventSet 事件集合置為 POLLHUP 或者 POLLERR,eventSet 事件集合發生了變化,這就導致 Selector 會被喚醒,進而導致 CPU 100% 問題,其根本原因就是 JDK 沒有處理好這種情況,比如 SelectionKey 中就沒定義有異常事件的類型,導致異常無法被捕捉和處理,從而一直空輪詢。zGT28資訊網——每日最新資訊28at.com

3.如何解決空輪詢?

NIO 空輪詢可能會導致 CPU 100% 的解決方案通常有以下兩種:zGT28資訊網——每日最新資訊28at.com

  • 升級 Java 版本:早期的 JDK 版本中(JDK 1.7 之前),這個 bug 較為常見,但后續的 JDK 更新中,Oracle 和 OpenJDK 團隊已經著手解決了這一問題,確保使用最新的 Java 版本可以減少遇到此問題的風險。但網上依然有人發現即使在 JDK 1.8 中,使用原生的 NIO 依然會發生空輪詢的問題,只是發生的概率變低了而已。
  • 使用第三方庫:對于無法升級 Java 版本的情況,或擔心新版本的 JDK 中依然存在空輪詢問題的團隊可以考慮使用已經解決了此問題的第三方庫,如 Netty。Netty 通過主動檢測和處理空輪詢情況,當檢測到可能的空輪詢時,會采取措施如臨時增加 Selector 的等待時間,或者重建 Selector,以此來避免 CPU 資源的浪費。

課后思考

說說 Netty 解決空輪詢的具體實現細節?為什么重建 Selector 可以避免空輪詢呢?zGT28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-91022-0.html阿里面試:NIO為什么會導致CPU100%?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 關于 CSS 的那些事兒,我從未被告知

下一篇: Java如何根據歷史數據預測下個月的數據?

標簽:
  • 熱門焦點
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數或類的行為。裝飾器本質上是一個函數,它接受另一個函數或類作為參數,并返回一個新的函數或類。它們通常用
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • 網紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業評論6月26日高調宣布入市,網絡名嘴大v胡錫進居然進軍了股市。在一次財經媒體峰會上,幾個財經圈媒體大佬就“胡錫進炒股是否知道認真報道”展開討論。有
  • 疑似小米14外觀設計圖曝光:后置相機模組變化不大

    下半年的大幕已經開啟,而誰將成為下半年手機圈的主角就成為了大家關注的焦點,其中被傳有望拿下新一代驍龍8 Gen3旗艦芯片的小米14系列更是備受大家矚
  • OPPO K11樣張首曝:千元機影像“卷”得真不錯!

    一直以來,OPPO K系列機型都保持著較為均衡的產品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
  • 最薄的14英寸游戲筆記本電腦 Alienware X14已可以購買

    2022年1月份在國際消費電子展(CES2022)上首次亮相的Alienware新品——Alienware X14現在已經可以購買了,這款筆記本電腦被譽為世界上最薄的 14 英寸游戲筆
  • 外交部:美方應停止在網絡安全問題上不負責任地指責他國

      中國外交部今天(16日)舉行例行記者會。會上,有記者問,美國情報官員稱,他們正在阻攔來自中國以及其他國家的黑客獲取相關科研成果。 中方對此有何評論?對此
Top 主站蜘蛛池模板: 太仆寺旗| 西平县| 苍梧县| 招远市| 松滋市| 高淳县| 改则县| 福贡县| 论坛| 石景山区| 樟树市| 资中县| 梁河县| 民勤县| 含山县| 和顺县| 金坛市| 师宗县| 来安县| 临泽县| 东兰县| 朝阳区| 竹北市| 汝州市| 九龙城区| 泊头市| 开鲁县| 屯昌县| 房产| 买车| 陕西省| 新乐市| 塘沽区| 松滋市| 乐平市| 武威市| 昭平县| 曲水县| 正镶白旗| 福清市| 牡丹江市|