netty
文章平均质量分 80
胖柯G
这个作者很懒,什么都没留下…
展开
-
netty源码浅析-池化内存直接申请
这里会赋值当前的poolSubpage是属于那个chunk,然后赋值内存分配管理数组下标位置,在这个chunk中的内存起始位置,赋值page的大小,然后创建一个长度为8的位图。比如这里我们是一颗树高度为2,就是[0,0,1,1,2,2,2,2],我们将下标找到这个最左侧的节点,也就是第一个2的位置将其变为了12,然后向上循环修改后的数组为[0,1,2,1,12,2,2,2],这样也就是说明跟节点能分配的大小为8M,他的左子节点能分配的大小为2M,右子节点可以分配4M大小。我们再次回到上面的申请方法。原创 2023-07-30 15:36:22 · 113 阅读 · 0 评论 -
netty源码浅析-池化内存回收
这里根据bitmapIdx计算在位图数组中的位置,然后将bit为重新设置为0,也就是没有被占用状态,然后设置下一个可用位置就是当前释放的位置,如果可用大小和最大可分配内容不相同则直接返回,说明这个poolSubpage还在被占用,如果相等,查看是不是就一个head节点,如果是也直接返回,如果不是可能是别的poolSubpage加入了pool,则将释放的subpage移除。直接内存通过两种方式释放堆外内存,一种是使用cleaner执行clean方法释放内存,一种是执行unsafe方法释放内存。原创 2023-07-30 15:38:13 · 165 阅读 · 0 评论 -
netty源码浅析-池化内存PoolThreadCache分配
其实PoolArena中的中的数组,如tinySubpagePools中的元素其实也是双向链表,他会把我们第一次申请的元素连接到数组中的head下,这样我们如果在下次需要申请和之前申请的长度相同时,就可以快速找到相同大小的已经分配的poolChunk,然后就可以直接通过这个page已经切分后的subpage进行分配了。这里我们看下分配后的大小分类说明。上面我们已经分析了没有命中缓存的分配方式,会分配一段连续的内存来分配,现在我们来分析一下名字缓存的分配方式,这个实现就在PoolThreadCache中。原创 2023-07-30 15:39:50 · 60 阅读 · 0 评论 -
netty源码浅析-PooledByteBuf扩容操作
在AbstractByteBuf中会有很多调用ensureWritable0的操作,判断需不需要扩容,我们跟踪到这个方法中,如果需要写入的空间比可写内存小则直接返回,不需要扩容,如果不是则重新计算需要扩容的长度。这里会先判断需要扩容的大小不能超过最大值,如果大小超过了4M,则每次向上取整获取扩容的大小,如果小于4M,则以64开始每次翻一倍,获取大于minNewCapacity的扩容值。我们上面分析了分配操作和回收操作,部分代码我们在上面已经分析过了,现在我们看下扩容操作。原创 2023-07-30 15:38:46 · 79 阅读 · 0 评论 -
netty源码浅析-数据接入与解码过程
数据接入与解码过程我们接着上面分析的服务端接收到数据后的处理,其中有一步是执行pipelinefireChannelRead(byteBuf)方法,将数据传递给后面的处理流程,我们看看后面的解码过程。我们继续跟踪这个方法会走到io.netty.channel.DefaultChannelPipeline.HeadContext#channelReadpublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Excepti原创 2021-05-21 23:06:56 · 284 阅读 · 0 评论 -
netty源码浅析-服务端数据接入
服务端数据接入//读事件和连接事件就绪,执行unsafe.read() //如果是boss线程则是OP_ACCEPT事件,如果是work线程则是OP_READ事件 if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || readyOps == 0) { unsafe.read(); }和上面的客户端接入原创 2021-05-21 23:05:07 · 151 阅读 · 0 评论 -
netty源码浅析-客户端接入
客户端接入当客户端调用connect后,服务端reactor线程在循环过程中会检查到这个事件,然后在processSelectedKey方法中处理。我们在上面也已经提到了这个方法,我们继续跟进,当客户端接入后,服务端发生了什么。//读事件和连接事件就绪,执行unsafe.read() //如果是boss线程则是OP_ACCEPT事件,如果是work线程则是OP_READ事件if ((readyOps & (SelectionKey.OP_READ | Selection原创 2021-05-10 22:04:35 · 193 阅读 · 0 评论 -
netty源码浅析-NioEventLoop-reactor线程分析
NioEventLoop-reactor线程分析经过上面的分析我们知道nioEventLoop线程会在第一次执行execute时,向task任务队列中添加任务时,在ThreadPerTaskExecutor中完成线程启动public void execute(Runnable command) { //通过线程工厂创建线程,启动并执行command threadFactory.newThread(command).start(); }线程启动后会执行runna原创 2021-05-09 21:01:26 · 130 阅读 · 0 评论 -
netty源码浅析-客户端启动流程
客户端启动流程我们以下面的demo作为本次netty源码分析的入口public static void main(String[] args) throws Exception { // Configure the client. EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.gro原创 2021-05-08 22:14:54 · 130 阅读 · 0 评论 -
netty源码浅析-服务端启动流程
服务端启动流程我们以下面的demo作为本次netty源码分析的入口public class Server { public static void main(String[] args) throws Exception{ EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try {原创 2021-04-27 22:42:28 · 232 阅读 · 0 评论