Netty

基本内容:链路有效性与心跳检测、内存池、主从reactor模型、直接内存与堆内存、源码分析(fastthreadlocal为什么快、对象池之recycle)

1.心跳检测:

    (a)目的:链路的有效性检测一般采用心跳检测,确认通信对方是否还活着能够继续正常发送/接收消息。

    (b)两类基本心跳检测机制:1.ping-pong机制,若连续N个周期发送ping而没有收到对方的pong响应,则发生[心跳超时],认为对方已下线。2.ping-ping机制,若连续N个周期没有接收到对方的ping命令,则发生心跳超时,认为对方已下线。读取/发送心跳消息时,如果发生IO异常,则链路已失效,称为[心跳失败]。

    (c)Netty的空闲检测机制:

2.内存池:应用预先向操作系统申请一块比较大的内存,自己进行管理,可以有效的减少内存碎片。

3.主从reactor模型:主acceptor(bossGroup)负责连接的建立就绪事件,注册到某个从EventLoop的selector上;从acceptor(workGroup)负责channel的读写就绪事件,当轮训到事件时,调用绑定的Thread处理事件。服务端接受一个连接后,选择一个EventLoop,把该channel绑定到他上面。

其它:

1.一个EventLoopGroup中包含一个或多个EventLoop。

2.一个EventLoop在整个生命周中只会与唯一的一个Thread进行绑定,所有由该EventLoop所处理的各种I/O事件都将在它关联的Thread上进行处理。==不要吧耗时长的业务逻辑放在handle线程里面,否则导致该线程严重阻塞。

3.一个channel在整个生命周期中只会注册在一个EventLoop上。==避免了多线程对channel的操作

4.一个EventLoop在运行过程中,会被分配一个或多个channel.==一对多

4.直接内存与堆内存:直接内存更快,read时少了从内核空间copy到用户空间的过程,write时少了从用户空间copy到内核空间的过程。具体 参操作系统的[虚拟]功能。

5.fastthreadlocal:

思路:用常量索引代替ThreadLocalMap的线性探测。注意,ThreadLocalMap对于hash冲突采用的是线性探测,不是和HashMap一样采用拉链法。

具体:每个FastThreadLocal实例有一个index成员,由InternalThreadLocalMap类的静态方法分配,保证了系统每个FastThreadLocal实例的index都不一样。

set()方法:
1.先拿到当前线程的InternalThreadLocalMap。调InternalThreadLocalMap的静态方法,如果是FastThreadLocalThread线程,直接拿FastThreadLocalThread线程内部的InternalThreadLocalMap实例,如果是java.lang.Thread,则通过java的ThreadLocal来放InternalThreadLocalMap,具体先拿UnpaddedInternalThreadLocalMap的静态ThreadLocal成员,然后拿到InternalThreadLocalMap。每个线程都有一个InternalThreadLocalMap实例,要么自己作为自己的属性(FastThreadLocalThread),要么借助UnpaddedInternalThreadLocalMap的静态ThreadLocal成员存储,每个线程都有一个系统惟一的value索引。
2.通过InternalThreadLocalMap实例,和FastThreadLocal实例的index,直接存值。InternalThreadLocalMap与ThreadLocalMap不一样,ThreadLocalMap对于hash冲突采用线性探测,InternalThreadLocalMap直接用索引定位元素位置,没有探测的过程,长度不够用就扩容,index大的话(FastThreadLocal实例比较多),数组就可能大一点,相当于空间换时间。

get()方法:
1.先拿到当前线程的InternalThreadLocalMap。
2.通过InternalThreadLocalMap实例,和FastThreadLocal实例的index,直接拿值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值