netty笔记

字符串大小写: 针对单个字母和字符串都有区别

判断是否是2的倍数 (val & -val) == val

epoll 100% CPU Bug

mpsc
producer放入元素时,通过cas,无锁放入
consumer 不用cas判断
size()时,需要判断前后操作获取值是否相同

获得使用的 Selector 对象,不需要每次访问使用 volatile 修饰的 selector 属性

nioeventloop

run和select都有个“死”循环

run结束
shutdown

select结束
select 操作超时
若有新的任务加入
查询到任务或者唤醒。
线程被异常打断。
发生 NIO 空轮询的 Bug 后重建 Selector 对象后。

第 44 至 51 行:如果满足下面任一一个条件,结束 select :
selectedKeys != 0 时,表示有 Channel 新增的就绪的 IO 事件,所以结束 select ,很好理解。
oldWakenUp || wakenUp.get() 时,表示 Selector 被唤醒,所以结束 select 。
hasTasks() || hasScheduledTasks() ,表示有普通任务或定时任务,所以结束 select 。
那么剩余的情况,主要是 select 超时或者发生空轮询。

runAllTasks
// 每隔 64 个任务检查一次时间,因为 nanoTime() 是相对费时的操作

tailTasks 中呢?实现了批量提交写入功能的 Handler ,高并发下,对提升吞吐量有不小性能提升

### Netty 学习笔记与资料 #### 关于Netty的基础概念 Netty是一个基于NIO(Non-blocking I/O)开发的网络应用框架,它简化了TCP/IP和UDP协议的应用程序开发过程。通过提供异步事件驱动模型以及丰富的API接口,使得开发者可以更专注于业务逻辑而非复杂的I/O操作细节。 #### Direct Buffer特性 Direct Buffer的一个显著优点是在使用Socket传输数据时表现出色的性能[^2]。因为这类缓冲区中的数据可以直接被操作系统访问,在某些情况下能够减少不必要的内存复制开销,从而提高效率。 #### 缓冲区内存管理机制 在Netty中,为了高效管理和利用内存资源,引入了两种类型的Buffer:堆内Heap Buffer和直接Direct Buffer。其中,对于后者而言,其创建成本较高但是适合频繁进行I/O操作场景下使用;而对于前者,则更适合一般性的应用场景,因为它具有较低的分配销毁代价。 #### 读写指针的工作原理 在一个典型的Netty应用程序里,涉及到的数据结构通常会包含一对指针——读指针和写指针。当执行写入动作时,写指针向前推进覆盖新的内容;而当发生读取行为时,则由读指针负责定位当前待处理的信息位置。这两者之间的区域代表尚未被消费的消息片段,一旦完成解析之后即成为历史记录不再保留价值[^1]。 #### 常见Buffer类型及其用途 根据不同种类的数据需求,Java NIO提供了多种专门化的Buffer实现类来满足特定场合下的存储要求。例如`ByteBuffer`适用于二进制流形式的数据交换;`CharBuffer`则针对字符序列进行了优化设计等等[^3]。 #### 数据写出流程分析 调用`writeAndFlush()`方法意味着启动了一轮完整的消息发送周期。此期间不仅包含了实际的数据打包封装工作,更重要的是触发了一系列预定义好的处理器链条上的各个节点依次发挥作用直至最终抵达目标端点[^4]。 ```java // 创建并配置ServerBootstrap实例 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); // 添加自定义处理器... } }); // 绑定监听地址及端口,并同步等待绑定成功 ChannelFuture f = b.bind(PORT).sync(); // 等待服务器套接字关闭 f.channel().closeFuture().sync(); } finally { // 清理资源 bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值