———————–【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申请内存的完整流程请说一下