在 Java 中總共有三種 IO 類型:BIO(Blocking I/O,阻塞I/O)、NIO(Non-blocking I/O,非阻塞I/O)和 AIO(Asynchronous I/O,異步I/O),它們的區別如下:
然而,隨著 NIO 逐漸使用,人們卻發現了 NIO 的一個經典問題,也就是臭名昭著的 Epoll(多路復用實現技術)空輪詢的問題。
空輪詢的問題是指,在 Linux 系統下,使用 Java 中的 NIO 時,即使 Selector(多路復用器)輪詢結果為空,也沒有 wakeup 或新消息要處理時,NIO 依舊會進行空輪詢,導致 CPU 一直上升,最終造成 CPU 使用率 100% 的問題。
該 BUG 相關可以參見以下鏈接:
空輪詢產生的原因可以在 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6670302 上找到答案,例如以下就是一個經典的 bug 復現場景:
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 中就沒定義有異常事件的類型,導致異常無法被捕捉和處理,從而一直空輪詢。
NIO 空輪詢可能會導致 CPU 100% 的解決方案通常有以下兩種:
本文鏈接:http://www.tebozhan.com/showinfo-26-91020-0.html阿里面試:NIO為什么會導致CPU 100% ?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 實操 OpenTelemetry:通過 Demo 掌握微服務監控的藝術
下一篇: 關于 CSS 的那些事兒,我從未被告知