NIO vs Netty
跨平臺和兼容性
NIO依賴操作系統平臺底層IO系統,Linux平臺上開發的功能可能在Windows平臺上并不奏效。除非將這些功能在所有的平臺上進行測試,這無疑是很大的工作量。
NIO.2只在JDK7開始支持,在JDK6上并不能使用。JDK中并沒有提供在NIO.2-簡介中提到的對AsynchronousDatagramChannel
(UDP)的支持,這樣我們就只能局限在TCP上。
是否選擇擴展 ByteBuffer
我們并不能從ByteBuffer獲取一個ByteBuffer數組的擴展,因為它的構造器并不對外開放。而在實際應用中一個ByteBuffer數組能夠很大程度上減少內存拷貝帶來的開銷。
分散和聚集可能引發內存泄漏
在JDK6、JDK7中會印發 OutOfMemoryError。
epoll bug
在類Linux系統上,選擇器使用了 epoll - IO事件通知功能.這是一個高性能的技術,在網絡棧的異步工作的系統上.不幸地是,即使今天,"著名的" epoll-bug 可能導致在選擇器中"無效的"狀態,導致了100%CPU使用和自旋.修復的唯一方式就是回收老的selector,然后將之前注冊的 Channel 實例傳給新創建的 Selector.
Selector.select() 會停止阻塞,直接返回,但是并沒有選擇人和的SelectorKey實例。這樣導致會有一個死循環吃掉你的CPU。
好吧,Netty都避免了上面的問題 大寫的NB