![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
自带buff
这个作者很懒,什么都没留下…
展开
-
netty源码解析(4.0)-29 Future模式的实现
Future模式是一个重要的异步并发模式,在JDK有实现。但JDK实现的Future模式功能比较简单,使用起来比较复杂。Netty在JDK Future基础上,加强了Future的能力,具体体现在:更加简单的结果返回方式。在JDK中,需要用户自己实现Future对象的执行及返回结果。而在Netty中可以使用Promise简单地调用方法返回结果。 更加灵活的结果处理方式。JDK中只提供了主...原创 2019-11-20 15:13:18 · 393 阅读 · 0 评论 -
netty源码解析(4.0)-28 ByteBuf内存池:PooledByteBufAllocator-把一切组装起来
PooledByteBufAllocator负责初始化PoolArena(PA)和PoolThreadCache(PTC)。它提供了一系列的接口,用来创建使用堆内存或直接内存的PooledByteBuf对象,这些接口只是一张皮,内部完全使用了PA和PTC的能力。初始化过程分两个步骤,首先初始化一系列的默认参数,然后初始化PTC对象和PA数组。默认参数和它们的值 DEFAULT_...原创 2019-11-05 16:13:09 · 408 阅读 · 0 评论 -
netty源码解析(4.0)-27 ByteBuf内存池:PoolArena-PoolThreadCache
前面两章分析的PoolChunk和PoolSubpage,从功能上来说已经可以直接拿来用了。但直接使用这个两个类管理内存在高频分配/释放内存场景下会有性能问题,PoolChunk分配内存时算法复杂度最高的是allocateNode方法,释放内存时算法复杂度最高的是free方法。 PoolChunk中二叉树的高度是maxOrder, 那么算法负责度是O(maxOrder),netty默认的ma...原创 2019-10-29 15:27:05 · 180 阅读 · 0 评论 -
netty源码解析(4.0)-26 ByteBuf内存池:PoolArena-PoolSubpage
PoolChunk用来分配大于或等于一个page的内存,如果需要小于一个page的内存,需要先从PoolChunk中分配一个page,然后再把一个page切割成多个子页-subpage,最后把内存以subpage为单位分配出去。PoolSubpage就是用来管理subpage的。 一个page会被分割成若干个大小相同的subpage,subpage的的大小是elemSize。elemSi...原创 2019-10-22 16:04:39 · 134 阅读 · 0 评论 -
netty源码解析(4.0)-25 ByteBuf内存池:PoolArena-PoolChunk
PoolArena实现了用于高效分配和释放内存,并尽可能减少内存碎片的内存池,这个内存管理实现使用PageRun/PoolSubpage算法。分析代码之前,先熟悉一些重要的概念:page: 页,一个页是可分配的最小的内存块单元,页的大小:pageSize = 1 << n (n <= 12)。 chunk: 块,块是多个页的集合。chunkSize是块中所有page的p...原创 2019-10-16 10:07:04 · 174 阅读 · 0 评论 -
netty源码解析(4.0)-24 ByteBuf基于内存池的内存管理
io.netty.buffer.PooledByteBuf<T>使用内存池中的一块内存作为自己的数据内存,这个块内存是PoolChunk<T>的一部分。PooledByteBuf<T>是一个抽象类型,它有4个派生类:PooledHeapByteBuf,PooledUnsafeHeapByteBuf 使用堆内存的PooledByteBuffer<by...原创 2019-10-09 15:54:44 · 241 阅读 · 0 评论 -
netty源码解析(4.0)-15 Channel NIO实现:写数据
写数据是NIO Channel实现的另一个比较复杂的功能。每一个channel都有一个outboundBuffer,这是一个输出缓冲区。当调用channel的write方法写数据时,这个数据被一系列ChannelOutboundHandler处理之后,它被放进这个缓冲区中,并没有真正把数据写到socket channel中。然后再调用channel的flush方法,flush会把outboundB...原创 2019-08-29 16:01:55 · 507 阅读 · 0 评论 -
netty源码解析(4.0)-14 Channel NIO实现:读取数据
本章分析Nio Channel的数据读取功能的实现。 Channel读取数据需要Channel和ChannelHandler配合使用,netty设计数据读取功能包括三个要素:Channel, EventLoop和ChannelHandler。Channel有个read方法,这个方法不会直接读取数据,它的作用是通知持有当前channel的eventLoop可以从这个这个channel读取数据了...原创 2019-08-22 16:31:09 · 542 阅读 · 0 评论 -
netty源码解析(4.0)-13 Channel NIO实现: 关闭和清理
Channel提供了3个方法用来实现关闭清理功能:disconnect,close,deregister。本章重点分析这个3个方法的功能的NIO实现。 disconnect实现: 断开连接 disconnect方法的调用栈如下:1 io.netty.channel.AbstractChannel#disconnect()2 io.netty.channel.Defau...原创 2019-08-20 14:57:41 · 807 阅读 · 0 评论 -
netty源码解析(4.0)-12 Channel NIO实现:channel初始化
创建一个channel实例,并把它register到eventLoopGroup中之后,这个channel然后处于inactive状态,仍然是不可用的。只有在bind或connect方法调用成功之后才能正常。因此bind或connect算是channel初始化的最后一步,本章这就重点分析这两个功能的实现。 接下来的代码分析如果没有特别说明,都是以NioSocketChannel为例。...原创 2019-08-14 16:32:09 · 157 阅读 · 0 评论 -
netty源码解析(4.0)-11 Channel NIO实现-概览
结构设计 Channel的NIO实现位于io.netty.channel.nio包和io.netty.channel.socket.nio包中,其中io.netty.channel.nio是抽象实现,io.netty.channel.socket.nio最终实现。下面是Channel NIO相关类的派生图: NIO实现最终派生出3个类型NioServerSocketChannel实...原创 2019-07-29 16:06:12 · 172 阅读 · 0 评论 -
netty源码解析(4.0)-10 ChannelPipleline的默认实现--事件传递及处理
事件触发、传递、处理是DefaultChannelPipleline实现的另一个核心能力。在前面在章节中粗略地讲过了事件的处理流程,本章将会详细地分析其中的所有关键细节。这些关键点包括:事件触发接口和对应的ChannelHandler处理方法。 inbound事件的传递。 outbound事件的传递。 ChannelHandler的eventExecutor的分配。 ...原创 2019-03-28 16:08:56 · 269 阅读 · 0 评论 -
netty源码解析(4.0)-9 ChannelPipleline的默认实现-链表管理
io.netty.channel.DefaultChannelPipeline implements ChannelPiplelineDefaultChannelPiple给出了ChannelPipleline的默认实现。ChannelPipleline是一个双向链表,本章的内容是分析默认实现中双向链表的实现。双向列表的的数据结构 DefaultChannelPiple使...原创 2019-03-28 16:04:28 · 150 阅读 · 0 评论 -
netty源码解析(4.0)-8 ChannelPipeline的设计
io.netty.channel.ChannelPipeline设计原理 上图中,为了更直观地展示事件处理顺序, 故意有规律地放置两种handler的顺序,实际上ChannelInboundHandler和ChanneOutboundHandler的顺序可以是任意,取决于用户调用add方法把handler方在哪里。 ChannelPipeline的特性: ...原创 2019-01-30 11:01:33 · 159 阅读 · 0 评论 -
netty源码解析(4.0)-7 线程模型-IO线程EventLoopGroup和NIO实现(二)
把NIO事件转换成对channel unsafe的调用或NioTask的调用processSelectedKeys()方法是处理NIO事件的入口:private void processSelectedKeys() {if (selectedKeys != null) {processSelectedKeysOptimized();} else {processSelect...原创 2019-01-23 09:30:15 · 235 阅读 · 1 评论 -
netty源码解析(4.0)-6 线程模型-IO线程EventLoopGroup和NIO实现(一)
接口定义io.netty.channel.EventLoopGroup extends EventExecutorGroup 方法 说明 ChannelFuture register(Channel channel) 把一个channel注册到一个EventLoop ChannelFuture reg...原创 2019-01-15 13:48:18 · 277 阅读 · 0 评论 -
netty源码解析(4.0)-5 线程模型-EventExecutorGroup框架
上一章讲了EventExecutorGroup的整体结构和原理,这一章我们来探究一下它的具体实现。EventExecutorGroup和EventExecutor接口io.netty.util.concurrent.EventExecutorGroupjava.util.concurrent.ScheduledExecutorServiceEventExecutorGroup继承了...原创 2019-01-08 15:49:09 · 986 阅读 · 0 评论 -
ThreadPoolExecutor代码解析
派生体系java.util.concurrent ThreadPoolExecutor AbstractExecutorService ExecutorService Executor 这个类是Executor框的核心实现,它的名字向我们表明,它是使用thread pool实现的。这个thread pool主要解决了两个问题:执行大量...原创 2019-01-02 21:52:33 · 166 阅读 · 0 评论