Netty
文章平均质量分 55
赵银龙
这个作者很懒,什么都没留下…
展开
-
Netty源码之Page级别的内存分配
在本篇文章中,我们将通过源码来看一下page级别的内存分配:allocateNormal()private synchronized void allocateNormal(PooledByteBuf<T> buf, int reqCapacity, int normCapacity) { //尝试从ChunkList上进行分配 if (q050.allocate...原创 2018-09-30 22:41:34 · 278 阅读 · 0 评论 -
Netty源码之命中缓存的逻辑分配
由于Netty在分配内存的时候首先会尝试从缓存中分配内存,所以这节我们就来看一下,它是怎么从缓存中进行分配的。这个数据结构是Netty中和内存缓存有关的数据结构,它由三部分组成:queue、sizeClass、size。queue中的每一个元素都是一个entity,每个entity中都有一个chunk和一个handler,handler用来执行一个唯一连续的内存。sizeClass代表着内存规...原创 2018-09-30 16:22:52 · 311 阅读 · 0 评论 -
Netty源码之内存规格
在Netty中,申请不同大小的内存所处理的逻辑是不一样的,这节我们会对Netty中的内存规格做一个简单的介绍默认情况下,Netty将内存规格划分为4个部分。Netty所有的内存申请是以Chunk为单位向内存申请的,大小为16M,后续的所有内存分配都是在这个Chunk里面的操作。8K对应的是一个Page,一个Chunk会以Page为单位进行切分,8K对应Chunk被划分为2048个Page。...原创 2018-09-30 14:03:46 · 257 阅读 · 0 评论 -
Netty源码之directArena分配direct内存的流程
这个流程分为以下几个步骤:1、从对象池里面拿到PooledByteBuf进行复用2、从缓存上进行内存分配3、从内存堆里面进行分配接下来我们跟到代码里面去看一下,回到newDirectBuffer这个方法:protected ByteBuf newDirectBuffer(int initialCapacity, int maxCapacity) { //拿到当前线程中的内...原创 2018-09-30 13:50:50 · 339 阅读 · 0 评论 -
Netty源码之PooledByteBufAllocator
在这个类中我们主要从下面这个方法开始看:protected ByteBuf newDirectBuffer(int initialCapacity, int maxCapacity) { //从当前线程中拿到一个cache对象 PoolThreadCache cache = threadCache.get(); //从cache中获得内存管理的顶层“竞技场”...原创 2018-09-30 10:00:20 · 955 阅读 · 1 评论 -
Netty源码之ByteBufAllocator
内存分配管理器有个最顶层的抽象叫做ByteBuAllocator,负责分配所有的内存,我们接下来看一下它有哪些功能: ByteBuf buffer(); /** * Allocate a {@link ByteBuf} with the given initial capacity. * If it is a direct or heap buffer depen...原创 2018-09-30 09:07:55 · 363 阅读 · 0 评论 -
Netty源码之Pipeline
在本文中我们讲解原创 2018-09-29 14:33:41 · 163 阅读 · 0 评论 -
Netty源码之客户端连接监听和客户端channel创建 服务端视角
在前两篇博客中,我们讲解了服务端的启动和EventLoop相关的源码,接下来,我们看一下服务端是如何监听客户端接入并建立连接的: private void processSelectedKey(SelectionKey k, AbstractNioChannel ch)当客户端想和服务端建立连接的时候,会被服务端channel绑定的selector轮询到这个io事件,之后就会调用上面这个方法...原创 2018-09-28 14:47:56 · 3408 阅读 · 0 评论 -
Netty源码之EventLoop创建,启动,执行
在Netty的执行线程中是没有用锁来保证同步的,并且它的执行效率非常高,那么,本文就先看一下Netty是如何设计EventLoop的,是如何执行工作的:EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup();从这行代码切入,先来看一下N...原创 2018-09-27 20:28:56 · 625 阅读 · 1 评论 -
Netty源码之服务端启动
上个学期自己也读过Netty的源码,但那个时候每想到通过博客的方式把它给记录下来,以至于,几个月过去后自己也忘得差不多了,所以打算重新读一遍Netty的源码,并把读的过程给记录下来,下面就开始吧:服务端启动流程:public static void main(String[] args) throws Exception { //一组boss线程,用来监听客户端的连接请求 E...原创 2018-09-27 00:01:13 · 196 阅读 · 0 评论 -
Netty源码之轻量级对象池Recycler
Recycler的作用是你在创建对象的时候不需要每次都通过new的方式去创建,如果这里面有已经用过的对象,那么可以直接取出来进行二次利用,当你不需要这个对象的时候就可以将他放到这里面,等之后需要再使用这个对象的时候就直接取出来进行二次利用。public class RecycleTest { private static final Recycler<User> RECYCL...原创 2018-10-02 14:38:56 · 216 阅读 · 0 评论 -
Netty源码之FastThreadLocal
我们都知道在jdk中有一个ThreadLocal,让每个线程都有一个独享的变量,Netty也是多线程工作的,所有它也需要这么一个机制,不出乎意料,果然他有一个FastThreadLocal,比jdk的ThreadLocal更快,接下来,我们就来感受一下他的源码。下面时代码的入口:public class FastThreadLocalTest { private static FastT...原创 2018-10-02 12:11:27 · 184 阅读 · 0 评论 -
Netty源码之编码
之前我们已经介绍了Netty中各种解码器的解码过程,本节我们就来看一下它是如何编码的,下面是我们添加的两个handler:ch.pipeline().addLast(new Encoder()); ch.pipeline().addLast(new BizHandler());第一个handler我们来看一下里面做了什么:public class Encoder extends Mess...原创 2018-10-02 11:33:29 · 138 阅读 · 0 评论 -
Netty之常见解码器分析
上一篇文章中我们简单的介绍了最顶层解码的流程,并且我们知道真正实现解码逻辑的是它的子类,那么,这节我们就将介绍集中解码器的分析1、基于固定长度的解码器public class FixedLengthFrameDecoder extends ByteToMessageDecoder { private final int frameLength; ... }在这个解...原创 2018-10-01 21:36:20 · 2423 阅读 · 0 评论 -
Netty之ByteToMessageDecoder
Netty中所有的解码器都是基于ByteToMessageDecoder来实现的,他的实现原理如下:1、累加字节流2、调用子类的decode方法进行解析3、将解析得到ByteBuf向下传播public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { //如果当前传进来的对象是ByteB...原创 2018-10-01 12:15:50 · 1874 阅读 · 0 评论 -
Netty源码之解码绪论
接下来我们将学习Netty解码的相关内容,所谓解码就是把一串二进制数据流解析成一个格式定义的数据包,也就是bytebuf,之后后续的逻辑业务的处理可以直接对这些bytebuf进行处理。首先对我们的服务端来说,收到的是一串二进制数据流,然后解码器通过一定规则的解码,将这些数据流解析成一个个bytebuf,也就是我们自定义格式的数据包,这个过程就是解码的过程,解码完成之后,就会把这些数据包交给我们...原创 2018-10-01 10:54:55 · 105 阅读 · 0 评论 -
Netty源码之ByteBuf回收
前面几篇博客我们已经详细讲了ByteBuf对内存的分配,是时候来看一下他是如何释放内存的了:buf.release();我们进入这个方法看一下: private boolean release0(int decrement) { for (;;) { int refCnt = this.refCnt; if (refCnt &...原创 2018-09-30 23:53:55 · 662 阅读 · 0 评论 -
Netty源码之subpage级别的内存分配
在上一篇文章中我们分析了page级别的内存分配,在这篇文章中我们将分析一下subpage级别的内存是如何分配的,和上一篇文章一样,我们还是先来看一下从新生成的chunk中进行内存分配:return allocateSubpage(normCapacity);我们进入这个方法中看一下:private long allocateSubpage(int normCapacity) { ...原创 2018-09-30 23:32:42 · 409 阅读 · 0 评论 -
Netty源码之arena、chunk、page、subpage概念
在本节我们将梳理一下有关内存分配几个非常重要的概念,分别是arena、chunk、page、subpage。接下来我们看一下什么是arena:在每个线程去申请内存的时候,他首先会通过ThreadLocal这种方式去获得当前线程的PoolThreadCache对象,然后调用他的allocate方法去申请内存,他一共分为两部分,一个是cache,在申请内存的时候首先会尝试从缓存中获取,另外一个就...原创 2018-09-30 17:02:56 · 1066 阅读 · 0 评论