1. 程式人生 > >Java中的NIO非阻塞模式和傳統的IO的阻塞模式線上程中的資源消耗

Java中的NIO非阻塞模式和傳統的IO的阻塞模式線上程中的資源消耗

       java中的NIO對於需要IO操作的程式來說,大大的提高了效率,但從NIO的實現模式來看(底層select的遍歷),因為其非阻塞的特性,犧牲了更多的系統資源,充分利用了硬體資源。

      在java的網路程式設計中,少不了執行緒操作。那麼這兩種模式對系統的消耗情況是什麼樣子呢?下面來分享一個自己的一次優化經驗

     我們的程式是SOCKET網路訪問,每秒的互動數量不小於500,除了網路狀況的要求外,程式的優化非常關鍵。

     我們的程式中有3條NIO的執行緒,有20多條傳統模式的IO執行緒。我們再while迴圈裡面都沒有休眠時間來看系統消耗。

     在有3條NIO(也包括了非常多的其他業務的處理執行緒),while中沒有休眠時間,CPU100%執行(CPU 2.26G  8執行緒),這個時候NIO是工作在非阻塞模式,也就是說如果沒有休眠時間,該執行緒是不會釋放CPU時間的。在while中加入了休眠1ms,CPU立馬降到 70%,基本上一個NIO無休眠執行緒消耗10%的CPU,也就是對於 單核的CPU來說80%的消耗。

    還有20條的阻塞模式的執行緒(執行緒在應用級別非同步接收提交的結果),while迴圈中沒有休眠時間,因為其非阻塞模式,在IO被佔用的時候,後來進來的IO操作等待,這個過程對CPU時間進行了釋放,這樣也就是說while迴圈中雖然沒有休眠時間,但是實際上是休眠了阻塞的時間。當在同樣的硬體環境和作業系統下,啟動這20個執行緒的時候,CPU消耗18%左右

    由上面的實際的例子可以看出,在進行NIO的程式設計的時候,一定要注意考慮到他的非阻塞模式,給系統的資源消耗帶來的影響。無論多快的應用需求,一定給NIO的執行緒休眠時間,如果不休眠是真正的“死迴圈”,會導致系統資源的大量消耗。

   從實際我們的平臺執行的情況看,如果需要大量的基於SOCKET的網路互動,因為阻塞模式的侷限,NIO是很有必要的。JAVA中的執行緒休眠時間只能是ms級別的,也就是說NIO的操作,如果想要低的系統資源消耗,那麼就只能每秒1000次得處理。目前還沒有找到好的方法讓休眠時間更多,只要給執行緒休眠時間,CPU就不會100%執行!

相關推薦

做無貨源淘寶店鋪,1688分銷模式傳統店淘模式該如何選擇?

淘寶規則在不斷的變化,一開始的傳統店鋪,我們自己找貨源,上貨,發貨等一系列的操作都是由我們自己去完成的,這樣一個月下來效果也不是很好;到後來的店淘模式,讓做店淘的我們省時又省力,不用再進貨囤貨,軟體採集淘寶聯盟商品,不用我們一件一件的去上貨,收益也提高了很多,相

JavaNIO阻塞模式傳統IO阻塞模式線上資源消耗

       java中的NIO對於需要IO操作的程式來說,大大的提高了效率,但從NIO的實現模式來看(底層select的遍歷),因為其非阻塞的特性,犧牲了更多的系統資源,充分利用了硬體資源。      在java的網路程式設計中,少不了執行緒操作。那麼這兩種模式對系統的消耗

JAVANIO的新特性小Demo,進一步了解NIO

讀取 sys java 傳輸 直接 通過 write != 指針 1.為什麽要用NIO NIO 的創建目的是為了讓 Java 程序員可以實現高速 I/O 而無需編寫自定義的本機代碼。NIO 將最耗時的 I/O 操作(即填充和提取緩沖區)轉移回操作系統,因而可以極大地提高速度

面向對象開發的七大設計原則23種設計模式

調停者模式 bili 叠代器模式 erp 策略模式 flyweight 理解 ati 轉換成 一、面向對象開發中的七大設計原則   軟件開發中最核心的思想就是“高內聚,低耦合”,主要的目的也是為了方便後期的維護和變更。下面的設計原則也是依靠這個核心思想衍生出來的。   1、

Java進階篇設計模式之九----- 解釋器模式叠代器模式

簡單 目的 java進階 使用 記錄 ace 客戶端 -- pro 前言 在上一篇中我們學習了行為型模式的責任鏈模式(Chain of Responsibility Pattern)和命令模式(Command Pattern)。本篇則來學習下行為型模式的兩個模式, 解釋器模

AndroidStudio2.2 Preview3NDK開發之CMake傳統 JNI在目錄結構配置檔案上的區別

 自從AndroidStudio更新到2.2,就有了CMake和傳統JNI兩種開發NDK的方法,主要就是在目錄結構和build.gradle上的區別,下面我們將分別介紹目錄區別和build.gradle種配置的區別(提示:在第一次用CMake時,最好在新建專案時勾選Include C++

Java進階篇設計模式之九----- 直譯器模式迭代器模式

前言 在上一篇中我們學習了行為型模式的責任鏈模式(Chain of Responsibility Pattern)和命令模式(Command Pattern)。本篇則來學習下行為型模式的兩個模式, 直譯器模式(Interpreter Pattern)和迭代器模式

UEFI BIOS 傳統BIOS 啟動模式對比

傳統BIOS開機流程 從你按下主機機殼上的電源鍵,到進入作業系統的期間,儲存於主機板上那顆EEPROM(電氣可抹除暨可程式化唯讀記憶體)裡的BIOS便會開始執行以下的工作: 1. 初始化: 當電腦開啟,CPU會自行重置為初始狀態,準備運作。BIOS boot bloc

ubuntu文字模式圖形化介面模式間的切換

從圖形化介面切換到命令列模式,我們可以通過按ALT+CTRL+F1、-----、F6,為什麼是F1、-----、F6,因為在Linux中一般有F1到F6多個命令列字元終端,也就是說我們可以同時開啟最多6個命令列介面。如按ALT+CTRL+F2的介面,命令列有提示tty2

觀察者模式發布/訂閱模式的區別

observe nbsp 初步 有時 觀察 觀察者 發生 狀態 發現 在事件總線(EventBus)的架構設計中,用到了發布/訂閱模式,但發現和觀察者模式挺接近,有時容易發生混淆,現試圖分清一下他們的關系。 觀察者模式的角色為觀察者(observer)

Spring Boot項目MyBatis連接DB2MySQL數據庫返回結果一些字符消失——debug筆記

select() 再次 batis ons tor sta nba spring 測試 寫這篇記錄的原因是因為我之前在Spring Boot項目中通過MyBatis連接DB2返回的結果中存在一些字段, 這些字段的元素中缺少了一些符號,所以我現在通過在自己的電腦上通過MyBa

觀察者模式發布訂閱模式(上)

nts 針對 處理 nds script 分享圖片 .data cto 這樣的 觀察者模式 定義:觀察者模式(Observer Pattern):定義對象間的一種一對多依賴關系,使得每當一個對象狀態發生改變時,其相關依賴對象皆得到通知並被自動更新。 其中有兩個定義需要明確,

多線設計模式:第五篇 - Future模式兩階段終止模式

捕獲 數量 如果 data counter 分享 就是 main 多次 一,Future模式 ????????Future 的意思是未來,假設有一個方法需要花費很長的時間才能獲取運行結果,那麽與其一直等待,不如先拿到一份最終數據的模板,即 Future 角色,等過一陣子再通

多執行緒設計模式:第三篇 - 生產者-消費者模式讀寫鎖模式

一,生產者-消費者模式         生產者-消費者模式是比較常見的一種模式,當生產者和消費者都只有一個的時候,這種模式也被稱為 Pipe模式,即管道模式。      &nb

單例設計模式多例設計模式

設計模式 單例設計模式 餓漢式單例 懶漢式單例 多例設計模式 單例設計模式 JavaSE:工廠+代理+單例 定義:一個類只允許產生一

python學習第二天:命令行模式Python交互模式

輸出 gin 所在 運行時 執行 分享圖片 enter .com alt 命令行模式 安裝完python開發環境和工具之後,在Windows開始菜單選擇“命令提示符”,就會進入到命令行模式: 或者都可以,然後 點擊enter鍵,彈出下圖中的窗口,即命令行模式,他的提示符

觀察者模式事件監聽模式的區別

監聽機制 其他 不包含 機制 監聽 多態 場景 觀察者模式 特定 事件監聽模式更像是觀察者模式的進階。 觀察者模式中,‘主題’會在特定邏輯下通知所有‘觀察者’。如果這個通知不包含任何信息,那麽這種實現就是通常的觀察者模式。 如果‘主題’通知‘觀察者’的過程帶有一些<其

Js與標籤屬性 關於在JS設定標籤屬性 jsjquery通過this獲取html標籤的屬性值

關於在JS中設定標籤屬性 2017-10-09 23:04 by 清風221, 12790 閱讀, 0 評論, 收藏, 編輯 Attribute 該屬性主要是用來在標籤行內樣式,新增、刪除、獲取屬性。且適用於自定義屬性。

微博feed系統的推(push)模式拉(pull)模式時間分割槽拉模式架構探討

     sns系統,微博系統都應用到了feed(每條微博或者sns裡的新鮮事等我們稱作feed)系統,不管是twitter.com或者國內的新浪微博,人人網等,在各種技術社群,技術大會上都在分享自己的feed架構,也就是推拉模式(timyang上次也分享了新浪微薄的模式)。

C++設計模式——工廠方法模式抽象工廠方法模式

一、工廠方法模式 上面的簡單工廠模式的缺點是當新增產品的時候就要去修改工廠的類,這就違反了開放封閉原則,(類、模組、函式)可以擴充套件,但是不可以修改,於是,就出現了工廠方法模式。所謂工廠方法模式,是指定義一個用於建立物件的介面,讓子類決定例項化哪一個類。 #d