自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(306)
  • 收藏
  • 关注

原创 Netty源码解析---FastThreadLocal-addToVariablesToRemove方法详解

FastThreadLocal 变量记录机制解析 摘要:本文详细分析了 Netty 中 FastThreadLocal 的 addToVariablesToRemove 方法实现原理。该方法用于记录线程使用的所有 FastThreadLocal 实例,类似图书借阅记录卡机制。当线程首次使用 FastThreadLocal 时,会在线程专属的 InternalThreadLocalMap 数组第0位置创建一个基于 IdentityHashMap 的 Set 集合,后续每次使用新的 FastThreadLoca

2026-04-03 17:53:34 336

原创 Netty源码分析----FastThreadLocal-index生成机制详解

FastThreadLocal索引生成机制解析 核心机制:基于静态AtomicInteger计数器(nextIndex)实现全局唯一索引分配 工作流程: 每个FastThreadLocal实例构造时调用nextVariableIndex() 通过原子操作getAndIncrement()获取自增索引值 检查索引溢出情况(超过Integer.MAX_VALUE) 应用方式: 索引作为线程本地存储数组(indexedVariables)的定位下标 实现O(1)时间复杂度的快速访问 设计特点: 全局唯一性保证 原

2026-04-02 18:15:35 159

原创 Netty源码分析---Reactor线程模型深度解析(二)

本文深入解析了Netty主从Reactor线程模型的实现细节。Boss Group负责监听端口、接受连接,通过ServerBootstrapAcceptor将新连接注册到Worker Group。Worker Group则处理已连接Socket的读写事件,执行ChannelPipeline中的Handler。源码分析展示了NioEventLoop的工作流程,包括事件循环、I/O处理与任务执行的平衡机制。文章详细阐述了从连接接受到事件处理的完整流程,揭示了Netty高性能网络通信的关键实现原理。

2026-04-01 08:31:18 396

原创 Netty源码分析---Reactor线程模型深度解析(一)

本文深入解析了Reactor线程模型及其演进过程。首先介绍了Reactor模式的核心思想:单线程监听多I/O事件源,通过事件分发机制处理请求,避免了传统BIO模型中线程资源浪费的问题。随后分析了BIO模型的局限性,包括线程开销大、上下文切换频繁等C10K问题。接着详细讲解了单Reactor单线程模型的实现架构,通过Selector实现事件监听和分发,所有I/O操作在单线程中完成。该模型代码示例展示了如何注册事件和循环处理连接请求,相比BIO模型能更高效地利用系统资源。

2026-03-31 09:15:40 358

原创 Netty源码分析---PoolChunk深度解析

Netty 内存池中的 PoolChunk 采用完全平衡二叉树管理 16MB 内存块,通过深度计算高效分配内存。核心机制包括:1) 使用 memoryMap 数组跟踪节点状态;2) 按需分配 8KB 页或更小的 Subpage;3) 通过位运算快速计算父子节点关系。默认配置下,每个 Chunk 划分为 2048 个 8KB 页,形成 11 层二叉树结构,实现 O(logN) 复杂度的内存分配。这种设计显著提升了内存分配效率,减少了碎片化问题。

2026-03-30 08:59:33 301

原创 Netty源码分析----FastThreadLocal深度解析

本文深入分析了FastThreadLocal的实现原理,首先介绍了JDK ThreadLocal的基本使用和实现机制。ThreadLocal通过为每个线程维护独立的ThreadLocalMap来实现线程隔离,使用线性探测法解决哈希冲突。然而,JDK实现存在性能问题:哈希冲突导致查找时间复杂度最坏为O(n),哈希计算需要额外开销,扩容时需要重新哈希所有元素。FastThreadLocal针对这些问题进行了优化,采用直接索引访问方式提升性能。

2026-03-27 10:18:51 181

原创 Netty源码分析---Recycler详解

Netty 的 Recycler 是一个轻量级对象池实现,核心原理如下: 线程本地存储:每个线程维护一个 Stack 对象栈,存储可复用对象 对象获取:通过 get() 方法从栈顶弹出对象,栈为空则创建新对象 对象回收:通过 Handle 接口的 recycle() 方法将对象压回栈中 多线程协作:支持其他线程归还对象到当前线程的队列中 关键组件: Stack:线程本地对象栈,使用数组存储 Handle:对象回收句柄,包含所属 Stack 信息 WeakOrderQueue:存储其他线程归还的对象 实现特点

2026-03-26 08:36:37 377

原创 Netty源码分析---PooledByteBufAllocator 源码深度解析

本文深入解析了Netty中PooledByteBufAllocator的源码实现。该类作为内存池总管理者,继承AbstractByteBufAllocator并实现ByteBufAllocatorMetricProvider接口,负责管理所有Arena内存区域和ThreadCache线程本地缓存。文章详细剖析了其静态常量配置,包括默认Arena数量、Chunk大小(默认16MB)、ThreadCache缓存大小等核心参数的计算逻辑。重点解读了静态初始化块中的关键算法:Page大小验证(默认8KB且必须为2的

2026-03-25 08:54:58 183

原创 Netty源码分析---Epoll空轮询Bug深度解析

Epoll 空轮询 Bug 摘要 JDK NIO 在 Linux 平台上存在严重的 Epoll 空轮询 Bug,表现为 Selector.select() 方法本应阻塞等待事件,却异常立即返回且无就绪事件(返回0),导致 CPU 空转飙升至100%。该问题源于 Linux 下 epoll 实现与 JDK NIO 的交互缺陷,主要出现在客户端异常断开或文件描述符状态异常时。虽然 JDK 官方已记录该问题(Bug ID: 6403933/6670302),但至今未完全修复,开发者需通过重选 Selector 或

2026-03-24 08:39:59 360

原创 Reactor线程模型深度解析

本文深入解析了Reactor线程模型,首先对比传统BIO模型存在的线程开销大、上下文切换频繁等问题,指出其无法解决C10K高并发挑战。然后详细介绍了Reactor模式的演进过程,包括单Reactor单线程模型的基本架构和工作原理,通过Java NIO代码示例展示了Selector事件循环机制如何实现单线程处理所有I/O事件。文章为理解高性能网络编程提供了基础框架,后续将继续探讨多Reactor线程模型的优化方案。

2026-03-23 08:45:26 418

原创 Netty源码分析---编码器深度解析-简约版

Netty编码器深度解析:主要介绍两种核心编码器。MessageToByteEncoder将Java对象转为字节流,通过类型匹配、缓冲区分配和编码流程实现高效网络传输。MessageToMessageEncoder则实现消息对象间的转换,常用于多层编码架构,为后续字节编码做准备。文章通过详细流程分析和示例代码,展示了编码器在Netty网络通信中的关键作用。

2026-03-21 08:00:00 763

原创 Netty源码分析---startThread方法详解

本文解析了Netty中startThread()方法的实现原理。该方法通过状态检查和CAS操作确保线程安全启动,使用ThreadPerTaskExecutor创建并启动新线程。关键点包括:1)状态检查避免重复启动;2)CAS操作保证原子性;3)异常处理恢复状态;4)通过ThreadFactory创建命名线程。该方法最终会执行EventLoop的run()方法进入事件循环。

2026-03-20 08:00:00 664

原创 Netty源码分析---SingleThreadEventLoop与EventLoop关系详解

摘要:本文详细分析了Netty中SingleThreadEventLoop与EventLoop的关系。NioEventLoop继承自SingleThreadEventLoop并实现了EventLoop接口,本质是一个单线程线程池,包含Selector和任务队列。关键点在于register()方法会将Channel绑定到NioEventLoop,并通过execute()确保所有Channel操作都在其绑定的EventLoop线程中执行,避免并发问题。这种设计是Netty线程模型的核心,保证了线程安全。

2026-03-19 08:00:00 459

原创 Netty源码分析---SingleThreadEventExecutor-execute方法详解

本文详细分析了Netty中SingleThreadEventExecutor.execute()方法的实现原理。该方法作为Netty线程模型的核心,主要功能包括:接收用户提交的任务、将任务添加到任务队列、启动EventLoop线程(如未启动)以及必要时唤醒阻塞线程。文章通过源码解析展示了关键步骤:参数校验、线程判断、任务入队和线程启动机制,特别解释了inEventLoop()判断的重要性及MPSC无界队列的特性。该方法实现了多线程到单线程的任务调度转换,确保任务顺序执行,是Netty高性能事件处理的基础。

2026-03-18 08:29:55 450

原创 Netty源码分析---register0方法详解

摘要:本文详细解析了Netty中AbstractChannel.register0()方法的实现机制。该方法负责将Channel注册到EventLoop的核心流程,包括Selector注册、状态更新和事件触发。关键点包括:1) 确保在EventLoop线程执行;2) 通过doRegister()完成底层Selector注册;3) 触发handlerAdded和channelRegistered事件;4) 根据首次注册状态决定是否触发channelActive事件。该方法还包含完善的异常处理机制,是Netty

2026-03-17 08:44:23 484

原创 Netty源码分析---SelectionKey与位运算详解

本文详细讲解了Java NIO中的SelectionKey及其位运算原理。SelectionKey是Channel和Selector之间的纽带,核心功能包括:1)建立两者关联;2)管理感兴趣事件(Interest Set);3)查询就绪事件(Ready Set);4)附加自定义对象;5)取消注册。文章通过银行号码牌的生动比喻帮助理解SelectionKey的作用机制。 重点解析了位运算在SelectionKey中的应用:1)左移运算符(<<)用于生成事件常量;2)位或运算(|)用于组合多个事件。

2026-03-16 08:37:43 562

原创 NioEventLoop事件检测与触发机制总结

Netty 事件处理机制总结 Netty 通过 NioEventLoop 处理不同 Channel 的事件,主要分为两种场景: 服务端 ServerSocketChannel:处理新连接事件(OP_ACCEPT),触发 channelRead 事件时传递的是新建立的 SocketChannel 对象 客户端/服务端 SocketChannel:处理数据读取事件(OP_READ),触发 channelRead 事件时传递的是包含数据的 ByteBuf 对象 处理流程包含三个核心步骤:事件检测(select)、

2026-03-15 17:42:36 353

原创 Netty解码器深度解析-详细版

Netty解码器深度解析摘要: Netty解码器主要用于解决网络通信中的TCP粘包/拆包问题,将字节流转换为应用层数据。核心解码器ByteToMessageDecoder通过累积缓冲区(cumulation)机制保存未解码数据,每次新数据到达都会追加并尝试解码。解码器实现需注意检查数据完整性,必要时重置读位置。ReplayingDecoder简化了这一过程,通过特殊ByteBuf包装器自动处理数据不足情况。典型解码流程包括:检查数据长度→标记读位置→读取长度字段→验证数据完整性→读取实际数据→传递解码结果。

2026-03-14 08:00:00 411

原创 NioEventLoop-run方法完整学习笔记

本文详细解析了Netty核心组件NioEventLoop的run()方法实现。该方法是Netty的事件处理引擎,采用无限循环结构,主要分为两个阶段:首先通过选择策略(selectStrategy)监听IO事件,支持CONTINUE、BUSY_WAIT和SELECT三种模式;然后根据ioRatio配置(默认50)平衡处理IO事件(processSelectedKeys)和执行异步任务(runAllTasks)的时间分配。文档还包含异常处理机制、wakeUp唤醒机制等关键细节,通过餐厅服务员的工作流程类比,帮助

2026-03-14 08:00:00 355

原创 Netty架构设计-事件驱动模型-详细版

Netty 架构设计:事件驱动模型详解(初学者版) 摘要 本文用生活化类比讲解Netty的事件驱动模型,帮助初学者理解其核心设计思想。传统网络编程将各种逻辑混在一起,导致代码混乱、难以维护。Netty通过事件驱动+责任链模式解决这些问题: 事件驱动:被动接收通知而非主动轮询,将网络操作分为入站(数据接收)和出站(数据发送)两类事件 责任链模式:将处理逻辑拆分为多个Handler,像流水线一样依次处理 核心组件包括: Channel:通信管道,类比电话线 ChannelHandler:事件处理器,类比餐厅不同

2026-03-13 09:52:45 31

原创 Netty架构设计-事件驱动模型-简洁版

Netty采用事件驱动模型实现高性能网络通信,核心架构包括: 事件驱动:通过回调机制处理网络事件,避免CPU轮询浪费 通道(Channel):抽象网络连接,提供统一操作接口 处理器链(Pipeline):采用责任链模式,数据依次经过多个处理器(Handler)处理 异步Future:通过结果占位符实现非阻塞操作 组件化设计:各模块职责单一,通过组合实现复杂功能 优势在于: 高性能:事件驱动+异步非阻塞 高扩展:责任链模式易于功能扩展 低耦合:组件化设计提升可维护性 Netty将复杂网络编程简化为"

2026-03-13 09:52:11 283

原创 Netty源码分析--认真系列(二)

本文深入分析Netty的事件处理机制,重点讲解入站事件和出站事件的传播流程。主要内容包括:1) 入站事件处理流程,从NioEventLoop检测事件开始,通过Unsafe对象触发channelRead事件,最终在Pipeline中从head向tail传播;2) 详细解析executionMask位掩码机制,该机制高效记录Handler实现的方法;3) 介绍常见入站事件类型及其触发时机,如channelRegistered、channelActive等。文章通过源码分析展示了Netty高效的事件处理架构。

2026-03-12 10:26:03 1236

原创 Netty编码器深度解析-详细版

Netty编码器深度解析:本文详细分析了Netty框架中MessageToByteEncoder编码器的工作原理,包括其与解码器的对称关系、核心工作流程和关键方法实现。文章通过源码解析展示了编码器如何将Java对象转换为网络字节流,包括类型检查、缓冲区分配、编码处理和资源释放等关键步骤。同时提供了Short编码器和自定义协议编码器的实战示例,演示了如何实现不同类型的编码器。文中还对比了直接内存和堆内存缓冲区的优缺点,为开发者选择合适的缓冲区类型提供了建议。

2026-03-11 08:00:00 367

原创 Netty核心组件EventLoop详解

Netty 核心组件 EventLoop 详解:EventLoop 是 Netty 中的"工人",负责处理 I/O 事件、执行任务和定时任务,本质是单线程执行器+Selector。EventLoopGroup 是工人组,管理多个 EventLoop,负责 Channel 绑定和负载均衡。示例展示了如何创建和使用 EventLoopGroup,以及如何优雅关闭。特别说明了 NIO EventLoop 与普通 EventLoop 的分工,建议将耗时任务交给普通 EventLoop 处理以避免

2026-03-11 08:00:00 392

原创 Netty源码分析---netty-init()方法解析

摘要 ChannelInitializer 是 Netty 中一个特殊的 ChannelHandler,主要用于延迟初始化管道(Pipeline)。它的核心特点包括: 延迟初始化 - 只在 Channel 注册到 EventLoop 后才执行真正的初始化逻辑,避免直接添加 Handler 时因未注册导致的错误。 自动移除机制 - 执行完 initChannel() 方法后会自动从 Pipeline 中移除,保证一次性使用。 简化配置 - 提供统一入口配置 Pipeline,ServerBootstrap 在

2026-03-10 08:00:00 363

原创 Netty源码分析---Netty-Pipeline初始化流程详解

本文深入解析了Netty Pipeline的初始化流程,主要分为两个阶段:准备阶段和执行阶段。在准备阶段,Netty通过initAndRegister()方法创建Channel实例并将ChannelInitializer添加到Pipeline中,但此时不会立即执行初始化逻辑。执行阶段发生在Channel注册到EventLoop后,触发handlerAdded()方法完成真正的初始化。文章详细跟踪了从客户端启动代码到addLast()方法的核心逻辑,揭示了Netty采用"延迟初始化"策略的

2026-03-10 08:00:00 399

原创 Netty源码分析---Netty-ByteBuf核心详解-简化版

Netty ByteBuf 核心要点摘要(150字) ByteBuf是Netty优化的字节缓冲区实现,解决了原生ByteBuffer的三大痛点:1)读写模式需手动切换;2)单指针限制;3)容量固定。其核心采用双指针设计(readerIndex/writerIndex),将内存划分为可丢弃、可读和可写三个区域,实现读写操作分离。相比ByteBuffer,ByteBuf具备自动扩容、零拷贝、引用计数等优势,API更友好(如writeBytes/readBytes无需flip)。典型使用流程:初始化→写入→读取→

2026-03-09 09:01:32 666

原创 Netty源码分析---Java-NIO-ByteBuffer核心详解-简化版

本文详细介绍了Java NIO中的ByteBuffer核心机制,主要包括以下内容:首先解释了为什么需要缓冲区来提升网络IO性能;然后深入分析了ByteBuffer的四个核心属性(capacity、position、limit、mark)及其相互关系;重点对比了写入模式和读取模式的特点与转换方法(flip());详细讲解了clear()和compact()等关键操作的使用场景;通过完整示例演示了读写流程和compact()的实际应用;最后总结了ByteBuffer的标准使用流程和模式切换规律。全文为理解Net

2026-03-09 08:00:00 24

原创 Netty源码分析---initChannel方法调用流程详解

摘要: 本文深入分析了Netty中ChannelInitializer的调用流程,重点解答了handler().handlerAdded(this)方法调用的是哪个ChannelInitializer实例的问题。通过追踪代码执行路径发现:该调用实际触发的是Bootstrap.init()中创建的匿名ChannelInitializer(Initializer-A)的handlerAdded()方法。文章详细阐述了Pipeline初始化过程,解释了为什么Initializer-A会被调用,以及它如何最终触发用

2026-03-08 08:00:00 377

原创 Netty源码分析---invokeHandlerAddedIfNeeded方法详解

Netty 的 invokeHandlerAddedIfNeeded() 方法解析 核心功能 invokeHandlerAddedIfNeeded() 是 Netty 中用于触发 pipeline 中所有 handler 的 handlerAdded() 回调的关键方法,主要特点: 延迟执行机制:通过 PendingHandlerCallback 链表管理待执行的回调任务 线程安全保证:确保在正确的 EventLoop 线程中执行回调 初始化关键点:在 Channel 注册完成后统一执行所有 pending

2026-03-08 08:00:00 364

原创 Netty源码分析---execute-method解析

Netty的SingleThreadEventExecutor.execute()方法核心流程:首先校验任务非空,判断当前线程是否为EventLoop线程;然后将任务加入队列。若非EventLoop线程提交任务,会启动EventLoop线程(仅首次调用时真正启动),并处理可能的关闭状态异常。该方法通过CAS确保线程安全启动,最终EventLoop线程会进入处理IO事件和执行队列任务的死循环。整个过程实现了线程安全的任务提交与执行机制。

2026-03-07 08:00:00 673

原创 Netty源码分析---handlerAdded方法调用详解

Netty 中的 handlerAdded() 方法调用机制分析: 继承体系:ChannelHandlerAdapter 提供 handlerAdded() 默认空实现,各子类可选择重写或继承默认实现。 关键实现: ByteToMessageDecoder 重写了 handlerAdded() 用于初始化累加器 ChannelInitializer 重写了 handlerAdded() 用于触发 initChannel() 回调 调用时机: 在 handler 被添加到已注册的 pipeline 时立即调用

2026-03-07 08:00:00 681

原创 Netty源码分析--认真系列(一)

Netty源码分析--认真系列(一)

2026-03-06 21:10:01 2022

原创 Netty源码分析---位运算详解

本文详细讲解了位运算的基础知识及其在Java NIO中的实际应用。首先介绍了位运算的基本概念和二进制表示方法,重点解析了左移运算符(<<)、位或运算(|)和位与运算(&)三种核心运算符的原理和使用场景。通过SelectionKey中的事件常量定义(OP_READ、OP_WRITE等)具体示例,展示了如何利用位运算高效地组合和判断多个事件状态。文章采用图解方式直观展示运算过程,并解释了这种设计在性能优化中的重要作用,为理解Java NIO底层机制提供了基础支撑。

2026-03-06 21:07:39 313

原创 Netty源码分析---waken方法详解

本文深入解析了Netty中NioEventLoop的两个关键机制:SelectStrategy状态和wakenUp标志。首先指出SelectStrategy.CONTINUE和BUSY_WAIT在实际运行中极少出现,默认实现仅返回SELECT状态或selectNow()结果,这两个特殊状态主要是为扩展性预留。其次详细阐述了wakenUp原子标志的作用,通过时序图展示了它在避免"唤醒丢失"竞态条件中的关键价值,解释了其如何确保任务提交后能可靠唤醒事件循环线程。文章通过源码分析和场景对比,揭

2026-03-06 21:07:01 382

原创 Netty源码分析---ThreadPerTaskExecutor与线程创建详解

Netty源码分析---ThreadPerTaskExecutor与线程创建详解

2026-03-06 21:06:07 152

原创 Netty源码分析---processSelectedKeys() vs runAllTasks()

文章摘要 本文对比分析了Netty中processSelectedKeys()和runAllTasks()两个核心方法的区别与作用。processSelectedKeys()负责处理网络IO事件(如读写、连接等),由Selector触发;而runAllTasks()处理应用层任务(如注册、业务逻辑等),从taskQueue中获取任务执行。两者分别对应网络层和应用层的处理,共同构成EventLoop的事件循环机制。文章通过代码示例和形象比喻(如餐厅服务员)生动说明了二者的分工协作关系,并附有详细对比表格。相关

2026-03-06 21:05:25 79

原创 Netty源码分析---NioServerSocketChannel-Unsafe初始化详解

Netty源码分析---NioServerSocketChannel-Unsafe初始化详解

2026-03-06 21:04:47 140

原创 Netty源码分析---NioEventLoop的run方法详解

本文深入解析了Netty中NioEventLoop的核心run()方法实现。该方法采用无限循环结构,主要包含三个关键步骤:1)通过select()方法等待I/O事件,根据任务队列情况智能选择阻塞或非阻塞模式;2)使用processSelectedKeys()处理I/O事件;3)通过runAllTasks()执行任务队列中的任务。文章详细分析了select()方法的实现逻辑,包括SelectStrategy策略如何根据任务存在与否决定使用selectNow()或阻塞select(),以及wakeup机制的设计

2026-03-06 21:03:58 348

原创 Netty源码分析---NioEventLoopGroup深度解析

本文深入解析了Netty中的NioEventLoopGroup线程池实现。NioEventLoopGroup是为NIO模型专门设计的事件循环线程池,由多个NioEventLoop线程组成,每个线程对应一个Selector和任务队列。文章详细介绍了其继承体系、构造过程、线程选择策略等核心机制。重点分析了默认线程数设置为CPU核心数*2的原因,以及bossGroup和workerGroup的分工设计。此外还讲解了线程池创建流程、任务执行机制和优雅关闭过程,揭示了Netty高性能背后的线程模型设计思想。

2026-03-06 21:03:06 346

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除