關於JAVA NIO一些體驗

2021-08-22 20:12:32 字數 1713 閱讀 7581

1.nio最大的變化是把服務端和客戶端抽像統一起來,用乙個selector來檢測事件。但把服務端與客戶端分開來做系統的難度會小些,效能也會高些(因為**裡少了檢查是服務端還是客戶端的部分)。

2.serversocketchannel只支援op_accept,socketchannel支援op_write、op_read、op_connect事件

3.乙個listenthread與乙個selector一一對應,selector的select方法是對事件進行輪詢,3000個連線大概要耗時20ms(這個是我自己的電腦上測試的結果,比較普通的配置),因此乙個selector負責的連線最好不要太多。

4.socketchannel的register方法會與selecotr.selector(timeout)相互阻塞,因此最好把所有註冊事件和註冊變更事件放到selector執行緒中來執行。

5.同時把所有accept事件放到selector執行緒中來處理,這樣可以避免執行緒間的切換,減少連線延時。

6.每次有select事件上來後,先把所有ready事件從interest集中去掉,否則多執行緒處理時,同樣的事件會報多次上來。

7.注意serversocketchannel註冊的事件必須有op_accept,否則下次有socket連線不上,而客戶端的op_connect只是開始註冊一次,在檢測一次後不需再重新註冊op_connect事件,如果再次重新註冊op_connect事件後會造成selector.selector(timerout)阻塞不了,一直不停地迴圈。

8.socketchannel.open()每次開啟乙個新的socketchannel,同理每次selector.open()也開啟乙個新的selector。

9.把所有的op_accept事件和修改interest事件交由selector執行緒來處理,這樣可以避免同步和阻塞,提高效能。

10.windows與linux的執行緒處理與網路處理還是有很大區別。經測試windows xp適合作客戶端(注意預設情況下,windows 為匿名(臨時)埠保留埠號 1024 到 5000,超出這個數量時就會報no buffer異常 ),如果拿來做服務端,客戶端會報大量的connect refuse。而linux2.6的網路處理較好(不管是客戶端還是服務端),經測試在cpu2.8g、mem512m的機子上能輕鬆處理幾萬個連線(如果報too many files open,可能系統設定有關,可通過ulimit -hsn 50000[每個程序能開啟的控制代碼數]來和echo 100000 >/proc/sys/fs/file-max[系統能開啟的最大檔案控制代碼數]來設定)。不知道windows2003做為伺服器時的效能怎麼樣。

11.jdk1.4的nio並不等於aio,只是在某個調上模擬非同步,效能沒有aio好(網上有人說aio比epoll高,也有說相反的,這個本人未驗證)。aio的實現有ibm的aio(windows上採用的是iocp,linux2.6上採用的aio)。(效能沒有經驗證)

12.windows上的socket收發快取可以隨便設定,但linux2.6上最小只能到1024byte(調整核心引數應該可以更改)。

13.jdk1.5update09與jdk6在linux上採用的是epoll,比之前的效能有明顯的提高(能處理更多的連線,在短時間內大量連線時會報更少的錯誤)

14.當連線數太多時,檢查連線超時也是個很大問題(每次select後再檢查時間截也許是個比較好的辦法)。

15.用檢視緩衝區比每個連線用乙個緩衝要好。(grizzly的做法是系統有乙個大的快取區4000000byte,然後每個執行緒在上面分割乙個bytebuffer)

有關於使用者體驗的一些總結

首先分享一句話 使用者是沒有錯的,如果使用者在使用某物品的時候遇到麻煩,那是因為設計出了問題。諾曼 設計心理學 認識使用者 使用者永遠都沒有錯。使用者都是特別忙,特別沒有耐心的人。使用者永遠都比你想象的聰明。使用者體驗對產品的重要性 不論使用者訪問的是什麼型別產品,都是乙個自助的行為。他們所能依靠的...

java nio中buffer緩衝區一些方法

flip 翻轉 我們已經寫滿了緩衝區,現在我們必須準備將其清空。我們想把這個緩衝區傳遞給乙個通道,以使內容能被全部寫出。但如果通道現在在緩衝區上執行get 那麼它將從我們剛剛插入的有用資料之外取出未定義資料。如果我們將位置值重新設為0,通道就會從正確位置開始獲取,但是它是怎樣知道何時到達我們所插入資...

關於一些前言

作為乙個菜鳥程式設計師,還是有很多好處的,可以看著各種大神的 不管看不看得懂都可以好不吝嗇的誇揚一番,因為著實就本人個人技術而言還處在提公升與成長階段,雖然來公司實習也一年了,而如今正直畢業,總想找點事情做做,心中總想著不能放任自己肆無忌憚的玩下去,做點有意義的事情,然而每每不能定心。關於考勤系統的...