BIO/NIO/AIO/Netty 知识点

I/O 的概念

I/O(Input/Output)指输入输出操作,是程序与外部设备(如磁盘、网络、键盘等)交互的过程。核心目标是实现数据的高效读写,分为磁盘 I/O、网络 I/O 等类型。


同步 vs 异步、阻塞 vs 非阻塞

同步/异步:关注任务完成的通知机制。同步需等待任务完成,异步通过回调或事件通知。
阻塞/非阻塞:关注等待时的线程状态。阻塞会挂起线程,非阻塞立即返回状态。

示例:

  • 同步阻塞:读取文件时线程阻塞直到数据就绪。
  • 异步非阻塞:通过回调通知数据就绪,线程可处理其他任务。

BIO(Blocking I/O)

BIO 是同步阻塞模型,每个连接需独立线程处理。线程在读写时阻塞直到操作完成。
示例:

ServerSocketserverSocket=newServerSocket(8080);while(true){Socketsocket=serverSocket.accept();// 阻塞newThread(()->handleRequest(socket)).start();}

NIO(Non-blocking I/O)

NIO 是同步非阻塞模型,通过 Selector 监听多个 Channel 的事件(如读写就绪),避免线程阻塞。
核心组件:

  • Channel:双向数据传输通道。
  • Buffer:数据容器。
  • Selector:多路事件监听器。

示例:

Selectorselector=Selector.open();channel.configureBlocking(false);channel.register(selector,SelectionKey.OP_READ);while(true){selector.select();// 阻塞直到事件就绪Set<SelectionKey>keys=selector.selectedKeys();// 处理事件...}

AIO(Asynchronous I/O)

AIO 是异步非阻塞模型,操作系统完成 I/O 后主动回调,无需线程轮询。
核心类:

  • AsynchronousSocketChannel
  • CompletionHandler

示例:

AsynchronousServerSocketChannelserver=AsynchronousServerSocketChannel.open();server.bind(newInetSocketAddress(8080));server.accept(null,newCompletionHandler<AsynchronousSocketChannel,Void>(){@Overridepublicvoidcompleted(AsynchronousSocketChannelclient,Voidattachment){// 处理连接...}});

Netty 简介

Netty 是基于 NIO 的高性能网络框架,提供事件驱动、零拷贝等特性,简化 NIO 编程。
核心优势

  • 线程模型优化(如主从 Reactor)。
  • 解决粘包/半包问题(如 LengthFieldBasedFrameDecoder)。

BIO、NIO、AIO 的区别

特性BIONIOAIO
模型同步阻塞同步非阻塞异步非阻塞
线程开销高(1连接1线程)低(多路复用)极低(回调驱动)
适用场景低并发高并发短连接高并发长连接

Java IO 流分类

  1. 按方向
    • 输入流(InputStream/Reader)
    • 输出流(OutputStream/Writer)
  2. 按单位
    • 字节流(操作二进制数据)
    • 字符流(处理文本,如 FileReader)

内核空间

内核空间是操作系统核心代码的运行区域,用户程序需通过系统调用(如read())访问硬件资源。I/O 操作本质是数据在用户空间与内核空间之间的拷贝。


五种 I/O 模型

  1. 阻塞 I/O
  2. 非阻塞 I/O
  3. I/O 多路复用(如 select/poll/epoll)
  4. 信号驱动 I/O
  5. 异步 I/O(如 AIO)

Bit、Byte、Char 的区别

  • Bit:二进制最小单位(0/1)。
  • Byte:8 bits,存储基本数据类型(如byte)。
  • Char:16 bits(Java 中),表示 Unicode 字符。

对象序列化与反序列化

序列化:将对象转换为字节流(如网络传输或持久化)。
反序列化:将字节流恢复为对象。
示例:

ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream("data.obj"));oos.writeObject(myObject);// 序列化

serialVersionUID 的作用

用于版本控制,确保序列化与反序列化的类兼容。未显式定义时,JVM 自动生成,但类结构变化可能导致反序列化失败。

生成方式:

privatestaticfinallongserialVersionUID=1L;// 手动指定

BufferedReader

属于字符缓冲流,提升读取效率。
常用方法:

  • readLine():读取一行文本。
  • close():关闭流。

Java IO 流顶级超类

  • 字节流:InputStreamOutputStream
  • 字符流:ReaderWriter

图片/视频必须用字节流

媒体文件是二进制数据,字符流可能因编码转换损坏内容。字节流(如FileInputStream)直接操作原始字节。


BIO 服务端为何多线程

单线程处理连接时会阻塞,无法并发响应。多线程允许同时处理多个客户端请求,但线程开销大(C10K 问题)。


多线程 BIO 瓶颈

  • 线程创建/销毁成本高。
  • 线程数过多导致上下文切换频繁,CPU 利用率下降。

线程池能否彻底解决 BIO

不能。线程池仅缓解线程创建开销,但高并发时仍受限于线程数量(如池满后请求排队)。


NIO 核心组件

  1. Channel:数据传输管道(如SocketChannel)。
  2. Buffer:数据容器(如ByteBuffer)。
  3. Selector:监听多个 Channel 的事件。

Buffer 重要属性

  • capacity:缓冲区容量。
  • position:当前读写位置。
  • limit:可操作数据边界。
  • flip():切换读写模式。

Selector 工作原理

通过系统调用(如epoll)监听注册的 Channel,当 I/O 事件(如读就绪)发生时,返回可处理的 SelectionKey 集合。


NIO 编程难点

  • 事件处理逻辑复杂(需管理 Buffer、Channel 状态)。
  • 需处理半包/粘包问题(如自定义编解码器)。

AIO 核心类

  • AsynchronousFileChannel:异步文件操作。
  • AsynchronousSocketChannel:异步网络通信。

Netty 线程模型

主从 Reactor 模式:

  • BossGroup:处理连接请求。
  • WorkerGroup:处理 I/O 事件。
  • 每个 Channel 绑定到固定 EventLoop 避免竞争。

Netty 解决粘包/半包

  • 固定长度解码器FixedLengthFrameDecoder)。
  • 分隔符解码器DelimiterBasedFrameDecoder)。
  • 长度字段解码器LengthFieldBasedFrameDecoder)。

Netty 零拷贝

  • Direct Buffer:避免 JVM 堆与 Native 内存拷贝。
  • CompositeByteBuf:合并多个 Buffer 减少拷贝次数。
  • 文件传输:通过FileRegion直接发送文件。

Netty 心跳机制

使用IdleStateHandler检测空闲连接:

pipeline.addLast(newIdleStateHandler(30,0,0,TimeUnit.SECONDS));pipeline.addLast(newHeartbeatHandler());

ChannelPipeline

责任链模式,包含一系列 ChannelHandler,按顺序处理入站/出站事件。示例:

pipeline.addLast(newDecoderHandler());pipeline.addLast(newBusinessLogicHandler());

Linux 底层支持

  • BIO:基于系统调用read()/write()
  • NIO:基于epoll(高效多路复用)。
  • AIO:依赖 Linux 的io_uring或 glibc 的线程池模拟。

Netty 不直接用 AIO

  • Linux AIO 对非文件 I/O 支持不完善。
  • NIO(epoll)已满足高性能需求,且更稳定。

优化 Netty 性能

  • 调整 EventLoopGroup 线程数(通常为 CPU 核数 * 2)。
  • 使用对象池(如Recycler)减少 GC 压力。
  • 开启 Native EPoll(EpollEventLoopGroup)。

Netty 内存泄漏排查

  • 启用ResourceLeakDetector
    System.setProperty("io.netty.leakDetection.level","PARANOID");
  • 检查未释放的 ByteBuf 或 Channel。

Netty 应用案例

  • Dubbo:RPC 框架。
  • RocketMQ:消息队列。
  • Elasticsearch:分布式搜索。
  • Spring WebFlux:响应式 Web 框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1200639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开题答辩全过程】以 基于BS结构的旅游网站的设计与实现为例,包含答辩的问题和答案

个人简介 一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等 开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。 感谢大家…

不止于抓取:2026年自适应夹爪品牌推荐

在智能制造迈向高柔性、高精度与高智能的2026年,自适应夹爪品牌正成为工业自动化升级的关键推手。随着3C电子、新能源、半导体等高端制造领域对微米级操作、零损伤抓取和快速换型需求的激增,传统气动夹爪已难以满足现…

2026必备!自考论文难题TOP8 AI论文网站测评

2026必备&#xff01;自考论文难题TOP8 AI论文网站测评 2026年自考论文写作工具测评&#xff1a;如何选择高效可靠的AI平台 随着自考人数的持续增长&#xff0c;论文写作已成为许多考生面临的重大挑战。面对选题困难、资料查找繁琐、格式规范不熟悉等问题&#xff0c;越来越多的…

考虑源-荷-储协同互动的主动配电网优化调度研究Matlab实现

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#…

强烈安利8个AI论文工具,MBA论文写作必备!

强烈安利8个AI论文工具&#xff0c;MBA论文写作必备&#xff01; AI 工具如何助力 MBA 论文写作&#xff1f; 在当前的学术环境中&#xff0c;MBA 学生面临着越来越高的论文写作要求。无论是研究选题、数据整理&#xff0c;还是内容撰写和格式规范&#xff0c;每一个环节都可…

揭秘人工智能在网络安全中的应用与挑战

人工智能在网络安全中的应用与挑战 随着数字威胁的日益复杂化&#xff0c;网络安全领域正在经历一场由人工智能驱动的变革。人工智能&#xff0c;特别是机器学习&#xff0c;通过分析海量数据集来识别模式和异常&#xff0c;为防御者提供了强大的新工具。 核心技术应用 威胁检测…

9款AI写论文哪个好?宏智树AI实测封神,毕业论文全流程开挂

作为深耕论文写作科普的博主&#xff0c;每年毕业季都被同学们追着问“AI写论文工具到底选哪个”。为了给出最客观的答案&#xff0c;我耗时一周实测了高校生高频使用的9款真实AI工具&#xff0c;从学术合规性、功能完整性、成果适配度三大核心维度逐一打分。最终结果一目了然&…

写论文软件哪个好?宏智树 AI 凭 “真科研” 实力领跑学术写作赛道

毕业季的深夜&#xff0c;你是否也曾对着空白文档陷入迷茫&#xff1f;选题没方向、文献似乱麻、数据分析无头绪、查重降 AIGC 双重压力压得人喘不过气&#xff1f;作为深耕论文写作科普的教育测评博主&#xff0c;我实测十余款论文工具后发现&#xff0c;宏智树 AI&#xff08…

宏智树AI:ChatGPT学术版驱动,重塑学术写作新生态

在学术研究的赛道上&#xff0c;低效的文献梳理、繁琐的数据处理、严苛的学术规范&#xff0c;常让科研工作者与高校师生陷入创作困境。宏智树AI&#xff08;官网&#xff1a;www.hzsxueshu.com&#xff09;&#xff0c;一款由ChatGPT学术版模型深度驱动、搭载AI5.0技术架构的专…

620-0085输入输出控制模块

620-0085 输入/输出控制模块&#xff08;I/O Control Module&#xff09;620-0085 是一款工业自动化系统中使用的 输入/输出控制模块&#xff0c;主要用于控制系统内部处理单元与现场 I/O 子系统之间的信号管理与调度&#xff0c;常见于老款或经典的分布式控制系统平台中。主要…

宏智树 AI:破解降重去 AIGC 双重难题,让论文回归学术本真

作为深耕论文写作科普的教育博主&#xff0c;后台每天都被两类求助刷屏&#xff1a;“查重率改到崩溃&#xff0c;越改语句越不通顺”“用 AI 写的初稿&#xff0c;导师一眼看出机器痕迹”。在学术检测技术全面升级的今天&#xff0c;论文合规早已不是 “降重就行”&#xff0c…

620-0086链路驱动器模块

620-0086 链路驱动器模块&#xff08;Link Driver Module&#xff09;620-0086 是一种用于工业自动化控制系统中的 链路驱动器模块。它的主要作用是在控制系统内部建立并维持通信链路&#xff0c;使控制中心与分布式 I/O 子系统之间的数据交换能够稳定可靠地进行。主要功能驱动…

Jenkinsfile编写全解析:从语法逻辑到团队协作,音视频项目自动化落地实践

在音视频开发领域&#xff0c;自动化构建部署是保障项目高效迭代的核心基础设施——无论是FFmpeg编解码模块的编译优化、Nginx-RTMP直播服务的部署升级&#xff0c;还是播放器SDK的打包发布&#xff0c;都需要一套稳定、可复用的自动化流程。Jenkinsfile作为Jenkins Pipeline的…

620-2032逻辑控制器模块

620-2032 逻辑控制器模块&#xff08;Logic Controller Module&#xff09;620-2032 是工业自动化控制系统中的一款 逻辑控制器模块&#xff0c;属于系统的核心控制单元之一。它主要负责执行控制逻辑、处理输入信号&#xff0c;并根据逻辑结果输出控制指令&#xff0c;协调现场…

M3U8深度解析:从原理到实战优化,搞定流媒体传输核心

在音视频直播、点播场景中&#xff0c;M3U8是绕不开的核心技术之一。作为HLS&#xff08;HTTP Live Streaming&#xff09;协议的灵魂&#xff0c;它凭借跨平台兼容性、自适应码率等特性&#xff0c;成为移动端和Web端流媒体传输的首选方案。本文将从原理、实操、优化、排障四个…

宏智树 AI:破解顶刊规范密码,AI 时代期刊论文的合规创作指南

随着《自然》《科学》等顶刊明确 AIGC 使用红线&#xff0c;APA、MLA 等格式规范迭代升级&#xff0c;期刊论文写作已进入 “智能赋能 合规优先” 的新阶段。很多科研人明明手握优质成果&#xff0c;却因选题错位、文献造假、图表不合规、AI 使用未声明等问题屡屡拒稿。作为深…

621-0010模拟输出模块

621-0010 模拟输出模块621-0010 是工业自动化系统中的 模拟输出模块&#xff0c;用于将控制系统的数字控制信号转换为现场可执行的连续模拟信号&#xff0c;以驱动阀门、变频器、执行器等设备。模块作用该模块位于控制系统与现场设备之间&#xff0c;将处理器或逻辑控制单元生成…

Deepoc具身大模型开发板:多模态融合的智能决策引擎

在机器人智能化升级的浪潮中&#xff0c;如何在不破坏原有机器人硬件架构的前提下&#xff0c;快速赋予机器人感知、理解、决策和执行能力&#xff0c;成为行业核心痛点。Deepoc具身大模型&#xff08;VLA&#xff09;外拓开发板应运而生&#xff0c;通过多模态融合技术&#x…

java_ssm12企业人事工资管理系统

目录具体实现截图企业人事工资管理系统摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 企业人事工资管理系统摘要 企业人事工资管理系统是基于Java SSM框架&#xff08;Spring、Spring MVC、…

测试开发必备技能:Python多线程处理

什么是进程 进程是执行中的程序 拥有独立地址空间&#xff0c;内存&#xff0c;数据栈等 操作系统统一管理 派生&#xff08;fork或spawn&#xff09;新进程 进程间通信&#xff08;IPC&#xff09;方式共享信息 什么是线程 同进程下执行&#xff0c;并共享相同的上下文 …