摘要:
这一节我们一起看下分配过程 上面的分配顺序,大家想一下为什么不是从q000开始分配呢?我找了一段分析的很好的。 在分析PoolChunkList的时候,我们知道一个chunk随着内存的不停释放,它本身会不停的往其所在的chunk list的prev list移动,直到其完全释放后被回收。 如果这里是 阅读全文
摘要:
前两节我们分别看了FastThreadLocal和ThreadLocal的源码分析,并且在第八节的时候讲到了处理一个客户端的接入请求,一个客户端是接入进来的,是怎么注册到多路复用器上的。那么这一节我们来一起看下客户端接入完成之后,是怎么实现读写操作的?我们自己想一下,应该就是为刚刚读取的数据分配一块 阅读全文
摘要:
上节讲过了ThreadLocal的源码,这一节我们来看下FastThreadLocal。这个我觉得要比ThreadLocal要简单,因为缺少了对于Entry的清理和整理工作,所以ThreadLocal的效率更高。 跟ThreadLocal一样,我们也先给一个结构图: 大家看这个图跟ThreadLoc 阅读全文
摘要:
为了更好地探讨Netty的内存模型,后面会用到,这里我还是决定跟大家一起看下ThreadLocal和FastThreadLocal的源码,有的时候我们在看源码的时候会一层层的遇到很多之前没有看过的内容,我觉得有的时候为了更好地理解大牛的思想,还是去跟一下源码比较好。ThreadLocal我想大家应该 阅读全文
摘要:
这一节我们来一起看下,一个客户端接入进来是什么情况。首先我们根据之前的分析,先启动服务端,然后打一个断点。 这个断点打在哪里呢?就是NioEventLoop上的select方法上。 然后我们启动一个客户端。 然后我们debug看到,selectedKey的数量 = 1,说明有accept或者读写等事 阅读全文
摘要:
接下来,我们看到的就是两个非常重要的方法 就是 processSelectedKeys() 和 runAllTasks() 方法了。 selectionKey中ready的事件,如accept、connect、read、write等,由processSelectedKeys方法触发。属于I/O任务。 阅读全文
摘要:
接上一篇,我们继续看 不知道大家第一次看这段代码的时候有没有一脸懵逼,反正我是一脸懵,为什么这个if else 最终都是调用的register0方法,都是一样的。 其实这里就是为什么Netty是线程安全的根本原因。 我们先看下 eventLoop.inEventLoop() 方法 第一张图传入了 当 阅读全文
摘要:
其实在将这一节之前,我们来分析一个东西,方便下面的工作好开展。 打开启动类,最开始的时候创建了一个NioEventLoopGroup 事件循环组,我们来跟一下这个。 这里bossGroup, 我传入了一个线程, workerGroup 没有入参,默认0, 也就是说父级我用一个线程来处理客户端的接入, 阅读全文
摘要:
接上篇,我们继续进入AbstractBootstrap类的 initAndRegister() 方法 进入init()方法 设置父级Channel的options, 进入到上节提到的NioServerSocketChannelConfig 其实就是为我们的channel.config()设置全局属性 阅读全文
摘要:
先看一下我Netty的启动类 Netty先创建了两个事件循环组 EventLoopGroup ,这个就对应了上文提到的模型, 第一个事件循环组的职责是 负责接收新的客户端连接 并 把客户端Channel注册到多路复用器上面。 第二个事件循环组的职责是 处理客户端的读写等事件。 Netty使用 Ser 阅读全文