IO和NIO
传统IO是面向stream流的(同步),一个字节一个字节的处理;NIO是面向buffer块的(异步),以块的模式处理
NioEventLoopGroup
channel是对java底层socket的抽象
netty解决jdk的epoll空轮训
如果每次轮询消耗的时间为 0,且重复次数超过 512 次,则调用 rebuildSelector()方法,即重构 Selector
创建一个新的 Selector
将原来 Selector 中注册的事件全部取消
将可用事件重新注册到新的 Selector 中,并激活
pipeline
head是ChannelInboundHandler,tail是ChannelOutboundHandler
每一个元素都是ChannelHandler,通过fire方法不断向后传递
ByteBuf
Netty 中所有的内存申请是以 Chunk 为单位向内存申请的,大小为 16M,后续的所有内 存分配都是在这个 Chunk 里面的操作。8K 对应的是一个 Page,一个 Chunk 会以 Page 为单位进行切分,8K 对应 Chunk 被划分为 2048 个 Page。
通过direct内存和零拷贝提高效率
ByteBufAllocator做内存分配:DirectBuf/HeapBuf * PooledBuf/UnpooledBuf * UnsafeBuf/非UnsafeBuf(系统支持UnsafeBuffer就优先UnsafeBuffer)
为了尽量重用缓冲区,减少垃圾回收,Netty提供了基于内存池的缓冲区重用机制,性能提高20倍。