———————–【Netty源码第一集】serverbootStrap.bind()源码分析————
    
    1、谈下Netty有多少组件,各个组件之间的关系是什么样的?
    
    2、Netty优化的地方有哪些?
    
    3、谈下你对NioServerSocketChannel的认知
    
    4、Netty提供的NioServerSocket是由如何与Nio结合在一块的?
    
    5、selector的创建是在那部分完成的呢?
    
    6、服务端启动源码分析,serverBootStrap.bind()都干了什么事?可以大概说下流程吗?
    
    ———————–【Netty源码第二集】:serverbootStrap.bind()源码分析下————
    
    1、绑定端口的时机是什么时候?
    
    2、绑定的具体动作在哪个地方?
    
    3、管道激活时机是在哪?
    
    4、原生NIO写的时候serverSocketChannel就直接注册了ACCEPT感兴趣事件,为啥netty 注册的时候不搞成ACCEPT事件,非得设计在bind完成之后 通过一个promise 才将serverSocketChannel 感兴趣事件改成ACCEPT
    
    5、全连接队列的大小在哪设置的?和Netty与关系吗
    
    6、 EventLoop的作用
    
    7、EventLoop的组成:
    
    8、Selector的创建是在哪完成的?
    
    9、NioEventLoop的两个selector有什么区别?
    
    10、Netty优化的selector是如何获取SeletionKey?
    
    ———————–【Netty源码第三集】NioEventLoop.run()方法源码分析上————
    
    1、EventLoop的Nio线程什么时候启动的呢?
    
    2、Nio线程的为什么只会创建一次?netty是如何保证的呢?
    
    3、EventLoop如何进行IO操作 普通任务处理 定时任务处理?
    
    4、EventLoop的run方法是如何同时支持 io操作和普通任务以及定时任务的呢?
    
    4、EventLoop的run方法是如何权衡 io操作和普通任务以及定时任务的呢?
    
    5、for死循环和while死循环的区别
    
    6、netty版本的不同run方法的实现存在差异
    
    7、run后半段代码,执行任务的时候IO占有率的含义有哪些?
    
    8、空轮训是什么?netty是如何解决空轮训的?
    
    9、讲一下NioEventLoop的run方法大概干了那些事?
    
    ———————–【Netty源码第四集】NioEventLoop.run()方法源码分析下———————–
    
    1、NioEventLoop的run方法对感兴趣是如何处理的呢?
    
    2、ServerSocketChannel的处理accept过程
    
    3、原生Nio编码模式中selector.select()之后做了什么事情?
    
    4、socketchannel读数据的过程是什么样子的?
    
    5、NioByteUnsafe和NioMessageUnsafe有什么区别吗
    
    6、为什么读数据的步骤是在一个dowhile循环中?
    
    7、channelRead被多次调用是不是等同于Client发了多次数据?
    
    8、doReadBytes方法的干了些什么事情?
    
    9、ContinueReading方法干了些什么事情?
    
    ———-【Netty源码第五集】 可扩缩容的分配器原理和Unsafe的实现——-
    
    1、Netty是如何知道使用堆外内存还是堆内内存?
    
    2、动态扩容的原理是什么呢?
    
    3、Unsafe的好处?
    
    4、Netty动态扩缩容的极限值
    
    5、传入要扩容缩容的size大小集合如何快速获取到合适的值呢?
    
    6、请说下扩容缩容的时机?
    
    7、扩容缩容的规律是什么?
    
    8、请你简述一下netty的动态扩缩容的实现过程?
    
    9、unsafe在哪里创建的?
    
    10、读的Unsafe是那个类?
    
    11、写的是那个类?
    
    12、Netty写数据的操作与业务写操作的区别是什么?
    
    13、AbstractUnsafe.write、channel.write()以及channel.flush()的认知
    
    14、AbstractUnsafe.write()是怎么将数据交给Netty存储的呢?
    
    15、AbstractUnsafe.write()在过滤msg为什么要转化为直接内存?
    
    16、AbstractUnsafe过滤msg是如何实现的呢?
    
    17、Netty为什么一定要尽量使用直接内存呢?实现方式有哪些?
    
    ——-【Netty源码第六集】write方法、Flush方法、outboundBuffer设计的原理分析——
    
    1、pipe.estimatorHandle.size(msg)为什么计算传输的数据大小的目的?
    
    2、为什么计算FileRegion返回0
    
    3、ByteBuf是直接内存为啥算占用的大小呢不应该也是0吗?
    
    4、outboundBuffer.addMessage(msg, size, promise);干了什么事?
    
    5、如何将ChannelOutboundBuffer中的存储数据输出到Socket缓冲区呢【SEND】
    
    6、ChannelOutboundBuffer中的存储数据输出到Sockete缓冲区会有多少种结果呢?
    
    7、Flush方法的原理分析
    
    8、Flush0的操作
    
    9、doWrite操作
    
    10、doWrite中ChannelOutBoundBuffer中的Entry是如何转行成Nio的ByteBuffer呢?
    
    11、OutBoundBuffer的结构请说明一下
    
    12、Entry入队时间和修改状态的时机
    
    13、为什么要设置成可以指定Entry对象属性信息所占的字节?
    
    14、OutBoundBuffer关于Entry状态的巧妙设计
    
    15、addMessage()分析
    
    16、你看完的领悟,你体会到的有什么思想?
    
    ——-【Netty源码第七集】flush分析以及LineBasedFrameDecoder的分析——-
    
    1、addFlush()分析
    
    2、doWrite关于in.nioBuffers(1024, maxBytesPerGatheringWrite);干了什么事情
    
    3、关于水位线的下降是如何处理的呢?
    
    4、write()干了什么事?flush()干了什么事?dowrite干了什么事?
    
    5、从开始调用channel.writeAndFlush()到数据写出都经历了什么?
    
    6、你的感悟有哪些呢?
    
    7、LineBasedFrameDecoder是如何完成解码的?
    
    ——-【Netty源码第八集】:LineBasedFrameDecoder——-
    
    1、LineBasedFrameDecoder如何处理最后一条消息的呢?
    
    2、LineBasedFrameDecoder当没有\r\n或者\n时怎么办?
    
    ————–【Netty源码第九集】:Pipeline的基础介绍、添加handler的分析、事件传播————–
    
    1、谈下你对Pipeline的认知
    
    2、为什么要用ChannelConext要包装channelHandler
    
    3、pipeline是在哪里创建的?
    
    4、pipeline.addLast(线程池,名字,handler)分析
    
    5、如何解决handler名称冲突的问题?
    
    6、Netty的Inbound事件的传播源在哪?
    
    7、事件如何在多个handler传递
    
    ————-【Netty源码第十集】:outBound事件传播,Netty优化介绍,JDK Timer的缺点。——–
    
    1、Netty的outBound事件传播源头
    
    2、Netty的outBound事件是如何在多个Handler中进行传播的?
    
    3、Netty优化的地方有哪些?
    
    4、JDK Timer的缺点
    
    5、完全二叉树的特点
    
    6、满二叉树的特点
    
    7、什么是小根堆,什么是大根堆?
    
    8、在应用过程中可能不满足堆序性的情况如何解决?
    
    9、什么情况下会使用上捋?
    
    10、典型的使用场景是什么?
    
    11、TimerQueue的特点
    
    ————-【Netty源码第十一集】:Netty时间轮的讲解上———-
    
    1、JDK中Timer小根堆【最小堆排序】是不好的,为什么?
    
    2、Netty自己设计了延迟队列体系?设计的算法是什么?
    
    3、时间轮时间间隔定义多大比较合适呢?
    
    4、干活的线程在没有任务的情况下?怎么办?
    
    5、如果延时的时间 超过 时间轮最大的时间表达范围 该如何处理?
    
    6、分层 为什么比 圈数 性能高?
    
    7、时间轮在Netty中的在哪些地方体现了?
    
    8、netty时间轮的参数设置
    
    9、Netty时间轮的微观组成
    
    10、你的感悟有哪些?
    
    ————-【Netty源码第十二集】:Netty时间轮的讲解下———-
    
    1、Netty时间轮的实现接口
    
    2、回顾时间轮
    
    3、Netty时间轮的默认设置
    
    4、HashedWheelTimer构造方法
    
    5、创建时间轮桶数组的时候为啥不能设置2的30次方?
    
    6、时间轮的数组大小是如何设计的?
    
    7、时间轮的数组大小如果给的不是2的次幂怎么办?
    
    8、为什么netty要求我们提供2的次幂?
    
    9、取模运算的过程
    
    10、位运算为何大于取模运算?
    
    11、怎么办取模运算变成位运算?
    
    12、newTimeOut(task,time,timeUnit)添加延迟任务的分析
    
    13、什么情况下会惰性启动newTimeOut,为什么要这么设计【当无CPU核数时如何懒运行】
   
    ——–【Netty源码第十三集】Netty的:时间轮worker中的run方法分析—
    
    1、worker中的run方法分析
    
    2、worker中的run让线程睡眠处理时为啥要加99999?
    
    3、worker中的run让线程睡眠的三种情况
    
    4、从timeouts队列中取出超时任务,添加链表这个步骤是怎么完成的?
    
    5、如何一个任务耗时过长时影响了其他定时任务,netty是怎么处理的?
    
    6、添加一个1s任务的任务给时间轮,描述下这个过程
    
    ——–【Netty源码第十四集】:时间轮worker的run方法中的超时任务、FastThreadLocal的前世今生——–
    
    1、JDK的Timer和Netty的事件轮的区别?
    
    2、ThreadLocal的是干什么用的?作用有哪些?好处有哪些?
    
    3、ThreadLocal的缺点有哪些?是如何解决的呢?解决的缺点是什么?
    
    ———–【Netty源码第十五讲】:FastThreadLocal的讲解上
    
    1、FastThreadLocal的基本用法
    
    2、Netty时间轮存在的问题
    
    3、Netty是如何处理超过它应该执行时间节点的任务?
    
    4、当定时任务过多时Netty如何才能提高延时任务的准备性呢?
    
    5、Netty是如何保证处理超过应该执行时间节点的任务?
    
    6、什么情况下tick的值会大于Calculated?
    
    7、Netty时间轮的收获与感想
    
    8、ThreadLocal的是干什么用的?
    
    9、ThreadLocal的应用体现在什么地方?ThreadLocal作用有哪些?好处有哪些?
    
    ———–【Netty源码第十六讲】:FastThreadLocal的讲解下
    
    1、FastThreadLocal的set方法的干了些什么?
    
    2、FastThreadLocal的get方法的干了些什么?
    
    3、InternalThreadLocalMap的get方法干了些什么?
    
    4、使用了FastThreadLocal之后效率一定比普通的ThreadLocal快吗?
    
    5、为什么需要再InternalThreadLocalMap 所对应的Object[]中的0号元素,要存储Set
    
    6、FastThreadLocal源码的心得
    
    ———–【Netty源码第十七讲】:内存池讲解一【基础概念】
    
    1、内存池的本质是什么?
    
    2、Java的开发中内存合理使用的目标是什么?
    
    3、内存池设计的核心是什么?
    
    4、如何解决内存池设计的核心?
    
    ———–【Netty源码第十八讲】:内存池讲解二【宏观概念】
    
    1、为什么要做内存规格?
    
    2、请你说下Netty内存池一共有多少种内存概念?
    
    3、为什么要提供Small和Tiny小单位?
    
    4、PoolAreana内部结构请描述下?
    
    5、PoolArena是如何存储tinySubpagePools和smallSubpagePools ?
    
    ———–【Netty源码第十九讲】:内存池讲解三【Tiny—small的讲解】
    
    1、Netty是如何管理小块内存的?
    
    2、tinySubpagePools数组[32] 每一个元素 存储的是什么东西呢?
    
    3、tinySubpagePools和smallSubpagePools是如何知道那些被使用了,哪些没有被使用?
    
    4、在PoolSubpage中的bitMap的作用是什么?
    
    5、PoolChunkList分配最小内存单位是多少?
    
    6、为什么PoolChunkList是6个呢?
    
    7、6个PoolChunkList对应的使用率各是多少?
    
    8、每个PoolChunkList为什么要做成一个区间?
    
    9、多个PoolChunkList配额为什么要设计的有重合?
    
    ———–【Netty源码第二十讲】:内存池讲解四【PoolChunk和PoolChunkList的讲解】
    
    1、PoolAreana中qinit和q000 看起来很像,本质上有什么区别?
    
    2、什么情况下qinit中会出现使用率0的chunk?
    
    3、什么情况下q000中会出现使用率0的chunk?
    
    4、q100的chunk存在使用率为0的情况吗?
    
    5、PoolChunkList的升级降级依靠什么?
    
    6、PoolChunkList降级free方法干了些什么事?
    
    7、请说下PoolChunkList chunk的创建过程?
    
    8、请说下PoolChunkList中chunk的移动过程?
    
    9、说一下你对PoolChunk的基础认知?
    
    10、PoolChunk如何对Page进行管理的【大概描述】?
    
    ———–【Netty源码第二十一讲】:内存池讲解五【伙伴算法、内存池的总结】
    
    1、PoolChunk如何对Page进行管理的【详细描述】?
    
    2、申请一个8k、16k存需要经历的过程请说一下
    
    3、Netty是如何申请内存的呢?
    
    4、为什么Netty申请内存会涉及Cache?
    
    5、PoolThreadCache 被Netty存储在了什么位置?作用?
    
    6、PoolThreadCache是如何 缓存内存空间?
    
    7、Netty申请内存的完整流程请说一下