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
网友评论