netty
文章平均质量分 86
六道木_
菜鸟一名~~
展开
-
Netty源码分析----PoolChunkList
整体介绍在Netty的内存分配的整体架构中,按我的理解,PoolChunkList是为了解决随着分配的次数增加,分配一段连续内存失败率提高的问题。 试想一下在Chunk中我们分配了很多小的内存,16B,32B,把整个Chunk都切割成这种小的内存块,那么当我们想要分配8KB或者更大的内存的时候,就会失败,因为其他Chunk被切割成很小的内存碎片,无法分配很大的一段内存,所以PoolChunk...原创 2018-04-14 16:03:28 · 323 阅读 · 0 评论 -
Netty源码分析----NioEventLoop之处理请求
(*文章基于Netty4.1.22版本) 之前已经讲了NioEventLoop的初始化以及核心的队列了,最后还涉及到的就是非常核心的一部分,就是NioEventLoop如何去处理请求。其核心逻辑是run方法,记得之前说过,NioEventLoop的线程初始化的时候,会调用一下run方法开始处理请求 private void doStartThread() { a...原创 2018-06-27 00:18:41 · 355 阅读 · 0 评论 -
Netty源码分析----NioEventLoop之任务队列
(*文章基于Netty4.1.22版本) 这篇文章主要分析一下NioEventLoop中任务队列相关的代码源码分析taskQueueexecute方法调用的时候或者执行完startThread方法,会调用addTask添加任务 protected void addTask(Runnable task) { if (!offerTask(task)...原创 2018-06-27 00:17:21 · 1944 阅读 · 2 评论 -
Netty源码分析----NioEventLoop之初始化过程及线程模型
Netty的线程模式网上很多文章都有介绍了,很多文章写得也好,加上我的表达能力不太好,这块线程模型的就不分析了,这篇文章主要讲一下Netty线程模型底层实现的细节。线程线程,肯定就是有线程去处理的,但是Netty的线程不是简简单单用一个Thread或者ThreadPool是去实现那样的一个线程模型,其核心是一个叫做EventLoop的东西,这个可以看成是一个Thread的封装、抽象,以NIO为...原创 2018-06-11 00:20:21 · 358 阅读 · 0 评论 -
Netty源码分析----注册监听事件
(*文章基于Netty4.1.22版本) 上篇服务启动的文章讲了3个步骤 1. 创建Channel并设置非阻塞 2. Channel绑定地址 3. Channel注册Selector但是其实,NIO还有一步是注册感兴趣的事件,在上一篇文章中,只是将感兴趣的事件存放到一个变量中,而没有进行注册,这里,我们看下注册的流程。 一开始我也没找到到底哪里进行注册的,后来先通过AbstractN...原创 2018-06-05 23:35:50 · 1236 阅读 · 0 评论 -
Netty源码分析----服务启动之开始接收请求及其他细节
(*文章基于Netty4.1.22版本) 在上一篇文章Netty源码分析—-服务启动之Channel初始化中,一开始给出了一个NIO的demo,然后从构造方法开始分析Netty对应的封装操作流程,而这篇文章,而这篇文章会开始分析,当初始化完成之后,Netty是如何开始接收请求的。 先看下上一篇文章NIO的demo中,是如何接收请求的(只保留run方法,其他忽略)public class N...原创 2018-05-28 00:04:46 · 1150 阅读 · 0 评论 -
Netty源码分析----pipeline
(*文章基于Netty4.1.22版本)介绍Netty中随着一个Channel的创建,会连带创建一个ChannelPipeline,这个ChannelPipeline就像一个处理各种事件的管道,负责去处理Channel上发生的事件,例如连接事件,读事件,写事件等。 更深入的说,处理的并不是ChannelPipeline,而是ChannelPipeline中一个个的ChannelHandl...原创 2018-05-27 23:45:14 · 2464 阅读 · 0 评论 -
Netty源码分析----服务启动之Channel初始化
Netty底层也是基于NIO,所以在分析服务启动的流程之前,我们先回顾一下NIO的启动Server的代码,写的一个Server例子如下,只保留和Netty启动相关的代码public class NioServer implements Runnable { public static void main(String[] args) { new Thread(new...原创 2018-05-20 13:59:15 · 3676 阅读 · 0 评论 -
Netty源码分析----PoolThreadCache
整体介绍在讲PoolArena分配的时候,有说到会先从线程缓存里分配,这个线程缓存其实就是PoolThreadCache(好了,从这里开始,要开始出现几个名字差不多的东西….别弄混淆了….(T▽T)),Netty从几个方面去减少线程之间的竞争,一个是在PooledByteBufAllocator持有多个PoolArena,使用线程相关的cache,通过这两种方法去减少竞争,当然其中会带来复杂度...原创 2018-05-13 15:43:54 · 449 阅读 · 0 评论 -
Netty源码分析----PoolArena
整体介绍前面介绍了PoolSubpage,PoolChunk,PoolChunkList,这在这之上还有个PoolArena,在这里面管理了前面3个结构,结构图如下: 包含了前面说的6个PoolChunkList,还有两个PoolSubpage数组,数组中的每个元素都是一个链表的头节点,在讲PoolSubpage的时候涉及的Head就是从PoolSubpage数组里取的在代码中,Po...原创 2018-05-13 15:36:48 · 318 阅读 · 0 评论 -
Netty源码分析----PoolSubpage
整体介绍分析PoolChunk的时候,讲到大于等于8KB走Chunk,否则走PoolSubpage,为什么要这么做呢?假如我们需要分配1KB的内存,那么如果还是用Chunk来分配,那么由于Chunk是默认8KB,那么就有7KB的空间浪费了,无法分配,因为一个Chunk是一个整体,所以Netty在Chunk之下拆分了大小相等的内存段,即PoolSubpage,这样空间的利用就更合理了源码...原创 2018-04-13 00:57:23 · 330 阅读 · 0 评论 -
Netty源码分析----PoolChunk
Netty内存管理这块比较复杂,断断续续看了一个多月了,总要有点输出,写几篇文章稍微分析总结一下整体介绍PoolChunk的结构是一颗平衡二叉树,如下: 注:左边代表的是节点的序号,右边的深度,例如512号节点深度为9,其数据结构为数组memoryMap和depthMap,初始化时相等PoolChunk默认深度为11,一个节点默认为8KB,上图中,最下面有Subpage这个结...原创 2018-04-12 00:02:36 · 740 阅读 · 0 评论 -
Netty源码分析----writeAndFlush
(*文章基于Netty4.1.22版本) ctx.writeAndFlush相当于先调用ctx.write然后再调用ctx.flush,所以下面分析write和flushwritewrite和flush会经过pipeline的每个outbound的Handler,之前文章分析过流程,这里不再分析。write方法最终到达HeadContext的write方法,然后什么都没做,将请求...原创 2018-07-04 00:33:12 · 3763 阅读 · 0 评论