netty源码分析及优点
今天梳理了一下netty源码调用流程,整理了一下详细流程图,如下
netty流程图
netty的优点
- Reactor主从设计模型
- Nio非阻塞
- 无锁化串行
- 零拷贝(使用直接内存)
- ByteBuf内存池
- 灵活的TCP参数配置能力
- 并发优化
然后找几个解释一下,如下
Reactor主从设计模型
Netty 抽象出两组线程池BossGroup和WorkerGroup,BossGroup和WorkerGroup类型都NioEventLoopGroup,BossGroup专门负责接收客户端的连接, WorkerGroup专门负责网络的读写,bossGroup每次和客户端执创建完连接,都会(轮询)选择一个workGroup,把selectorKey注册到workGroup上NIOEventLoop的selector,所以客户端下一次进行数据交互的时候就会在workGroup上。
无锁化串行
#
在Netty中的无锁化串行是指数据在ChannelPipeline中执行Handler是串行执行的,不存在多线程,这样就减少了为了竞争锁带来的性能下降,我们可以通过配置NIO线程池参数来指定多个串行线程并行运行,这样的效率会更高。而且Redis也是利用这种思想来设计的。
直接内存
直接内存指的是元空间或者物理机的内存,是堆外内存。
使用直接内存的优点如下
- 不占用堆内存空间,减少了发生GC的可能
- 不需要从物理内存拷贝到堆内存(零拷贝原理)。
缺点:
- 初始分配慢
- 没有jvm管理,容易出现fullGC
#
零拷贝
数据在交互过程中一般需要先从socket中拷贝到物理内存,然后从物理内存在拷贝到jvm内存,处理完之后再从jvm内存拷贝到物理内存,物理内存写出到socket中,这是一个完整的数据传输过程,而零拷贝是指由于使用了直接内存,并不需要从物理内存拷贝到jvm内存,jvm堆内使用是地址指向直接内存,少了一次交互,所以称之为零拷贝。
还没有评论,来说两句吧...