
netty
文章平均质量分 93
ijbuhv
这个作者很懒,什么都没留下…
展开
-
netty源码阅读之十一(unsafe中的register,deregister,connect,bind等方法)
这个分享阅读的是4.1.52.Final-SNAPSHOT这个版本的源码unsafe是每个channel都会对应的一个对象,把它定义为Unasfe是因为用户是无法直接操作这个接口的,它是由netty内部进行调用的,这个接口主要是用来进行具体的IO的处理的。并且除了register,deregister等,其他方法都需要在eventLoop中完成操作的。下面表中列出了其主要的方法,并列出了由于这些方法可能会fire出的事件,其中红色的方法表示的是这些方法是outbound方法,即这些方法是从ch..原创 2020-09-16 17:22:08 · 1010 阅读 · 0 评论 -
netty源码阅读之十(channel概述)
这个分享阅读的是4.1.52.Final-SNAPSHOT这个版本的源码channel主要是作为网络管道的包装类,对于不同类型的管道进行了抽象,并对它们进行了相应的包装,并对外提供了对应管道的状态,以及相应管道的IO等方法。Channel内部还提供了一个Unsafe接口,这个接口是用于netty内部对channel进行调用,而不由外部来进行操作。在具体介绍Channel之前,有不要介绍一下Channel,ChannelPipeline,ChannelHandlerContext,Chann..原创 2020-09-15 16:05:01 · 318 阅读 · 0 评论 -
netty源码阅读之九(ChannelOutboundBuffer)
这个分享阅读的是4.1.52.Final-SNAPSHOT这个版本的源码ChannelOutboundBuffer是作为channel写的缓存,即为channel.write(msg)不是将数据写入网络管道中,而是写到ChannelOutboundBuffer中,而是flush操作将channel中的数据从ChannelOutboundBuffer写入到管道中。下图为这个ChannelOutboundBuffer的数据结构,可以看到它主要是维护了一个链表用于存储数据,并且维护了三个节点位置:.原创 2020-09-10 13:39:49 · 273 阅读 · 0 评论 -
netty源码阅读之八(EventLoop)
这个分享阅读的是4.1.52.Final-SNAPSHOT这个版本的源码EventLoop是netty中很重要的一部分,netty的Reactor线程模型也主要是利用EventLoop来进行完成的,一个EventLoop主要是处理注册到这个EventLoop的Channel的IO操作。下面先来看一下NioEventLoop的继承树,可以看到是还是比较复杂的继承关系。途中的右边的蓝线则是其对应的类的继承,绿色实线则是接口继承关系,绿色虚线则是类实现接口关系。可以看到其最顶层基类是Abstra..原创 2020-09-07 19:45:56 · 403 阅读 · 0 评论 -
netty源码阅读之七(ByteBuf的方法分类)
这个分享阅读的是4.1.52.Final-SNAPSHOT这个版本的源码ByteBuf是netty自己实现的对byte[],ByteBuffer这两种从堆或者堆外分配的内存的访问和修改的抽象接口,并提供比ByteBuffer更丰富的操作的方法。下面图展示了ByteBuf三个比较重要的变量,分别为readIndex,writeIndex和capacity,它们三个的关系是: 其中read...原创 2020-08-31 13:25:12 · 1092 阅读 · 0 评论 -
netty源码阅读之六(Recycler)
Recycler是一个基于ThreadLocal的轻量级的对象池,其对象池中的对象都存在各个线程的对应的ThreadLocal中。下面图是一个Recycler对应的数据结构。Recycler为每个线程都绑定了一个Stack对象存储了当前线程下回收的对象,并且一个Map<Stack, WeakOrderQueue>存储一个其他线程创建的对象。可以看到下面的thread1绑定了一个stack1,而stack1在thread2和thread3的Map<Stack, WeakOrderQu原创 2020-08-27 15:37:23 · 240 阅读 · 0 评论 -
netty源码阅读五(内存池之PoolArena和PoolChunkList)
PoolArena是外部申请内存的主要入口,在多线程处理器中,每个线程都会对应一个DirectPoolArena和HeapArena,而其选取的策略则是轮询找出最少的thread的arena,这种轮询的方式能让每个PoolArena中的Thread更加的平均,下面图则是线程和PoolArena的对应图。这种线程模型保证的是同一个线程对应下分配的PooledByteBuf是在同一块的PoolArena中,但是同一个线程进行free的PooledByteBuf则不一定是同一个PoolArena。因为原创 2020-08-08 15:18:09 · 690 阅读 · 0 评论 -
netty源码阅读四(内存池之PoolChunkList)
这个分享阅读的是4.1.52.Final-SNAPSHOT这个版本的源码jemalloc论文PoolChunkList主要维护了一个双链表存储PoolArena中的PoolChunk。jemalloc按照内存的使用度将其划分为QInit,Q0,Q25,Q50,Q75 ,Q100这几个类型,下面入是jemalloc论文中的一张图,展示了每种类型的PoolChunkList内存的使用情况。其中的虚线表示一个PoolChunk从一个类别移动到另一个类别其对应的内存度。可以看到对于内存的内存的回收是.原创 2020-08-08 15:17:32 · 361 阅读 · 0 评论 -
netty源码阅读三(内存池之PoolSubpage)
这个分享阅读的是4.1.52.Final-SNAPSHOT这个版本的源码jemalloc论文PoolSubPage主要是对sizeClasses中isSubPage是1的内存的分配(即大小小于1<<(pageshift+LOG22_SIZE_CLASS_GROUP)的对应的内存)的分配。其主要是在PoolChunk将一页或者多页内存的数据分配为多个第一次请求的内存块,用PoolSubPage来维护。一个PoolArena的所有的可以被分配的PoolSubpage都由PoolAre.原创 2020-08-08 15:16:52 · 430 阅读 · 0 评论 -
netty源码阅读二(内存池之PoolChunk)
这个分享阅读的是4.1.52.Final-SNAPSHOT这个版本的源码jemalloc论文poolChunk表示的内存池中一整块的内存,也是内存池向java虚拟机申请和释放的最小单位,即内存池每次会向虚拟机申请一个PoolChunk内存来进行分配,并在PoolChunk空闲时将PoolChunk中的内存释放。内存池对于内存的分配其最终分配的是内存所处的PoolChunk以及PoolChunk下的句柄handle。重要术语在介绍PoolChunk代码之前先介绍几个比较重要的术语。.原创 2020-08-08 15:15:50 · 1460 阅读 · 0 评论 -
netty源码阅读一(内存池之SizeClasses)
这个分享阅读的是4.1.52.Final-SNAPSHOT这个版本的源码jemalloc论文SizeClassessizeClasses是表示对于内存池中分配的内存大小需要对齐的size,在jemalloc论文中将其分为了三块,分别为Small,Large和Huge。其中Small和Large是在Arena中分配的,而Huge则是直接在Arena之外进行分配的。下面则是其对应的各个size的图。不过对于Netty来说其对应的sizeClasses是有所不同的。下面的表格展示了nett.原创 2020-08-08 15:14:58 · 1669 阅读 · 12 评论