Netty源码

  • Post author:
  • Post category:其他


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



版权声明:本文为weixin_43996338原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。