news 2026/6/10 17:20:27

Java IO 全家桶:从 BIO 到虚拟线程,一篇就够

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java IO 全家桶:从 BIO 到虚拟线程,一篇就够

01 为什么又要聊 IO?

最近再做文件流传输,发现JDK更新新的东西,而网上都还没有具体的应用方法。
现在 JDK 21 已 GA,虚拟线程官宣“同步代码跑出异步性能”,于是有了这篇“2025 版全家桶”。
不管你是刚学 Java 的本科生,还是天天调网关的社畜,都能 10 分钟看完、5 分钟定位线上慢 IO。

02 全景地图:一图胜千言

BIO(同步阻塞) → NIO(同步非阻塞) → AIO(异步回调) → 虚拟线程(阻塞代码+纤程)

把鼠标滚轮锁死,下面按顺序展开。

03 BIO 还没死:如何用出“高级感”

  1. try-with-resources 是底线,别再手写finally close()
  2. InputStream.transferTo(OutputStream)是 JDK 9 送的零拷贝语法糖,8 行代码缩成 1 行。
  3. 字符集请用StandardCharsets.UTF_8,别再catch UnsupportedEncodingException骗自己。
  4. 网络传输先套BufferedInputStream再套GZIPInputStream,顺序反了性能掉 30%。

04 NIO 三板斧:Buffer、Channel、Selector

DirectBuffer vs HeapBuffer

  • 实验:4 MB 文件,DirectBuffer 比 HeapBuffer 少 35% cache-miss。
  • 代价:分配慢、不受 GC 管,记得加-XX:MaxDirectMemorySize,别等 OOM 再百度。

零拷贝“两板斧”

  1. fileChannel.transferTo()—— 内核 sendfile,用户态 0 拷贝。
  2. FileChannel.map()—— 大文件随机读写像操作数组,单机 10 Gbps 打满 CPU 还能剩 70%。

Reactor 模型手绘版

MainReactor→只 accept ↓ SubReactor→真正 read/write

Netty 默认就是这个套路,8 核 16 G 云主机轻松 100 w 并发。

05 AIO:真异步,但别乱用

AsynchronousSocketChannel+CompletionHandler确实能把线程数压到几十,
代价是“回调地狱”+“调试断点找不到北”。
除非写代理网关、计算量极轻,否则 Reactor 更简单。

06 虚拟线程:JDK21 的“降维打击”

代码还是最古老的阻塞写法:

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { executor.submit(() -> { var in = socket.getInputStream(); // 阻塞读 }); }

底层把 1 w 个虚拟线程挂到 1 个平台线程上,阻塞操作不再占内核栈。
官方 benchmark:Tomcat NIO 7 w QPS → Virtual Thread 12 w QPS,延迟还降一半。
结论:新项目直接上 JDK21,写完同步代码就可以去喝茶。

07 线上排查“三板斧”

  1. strace -c -e trace=%network java App
    read/write系统调用次数,比业务预期高 1 个量级 → 没加 Buffer。
  2. perf stat -e cache-misses
    对比 DirectBuffer 与 HeapBuffer,miss 差 35% 以上就能拍板换 Direct。
  3. jstack | grep 'parking to wait'
    线程都卡在park→ 连接数 > 线程池,上 Selector 或虚拟线程。

08 避坑 20 秒速记

  • BufferedOutputStream忘记flush(),文件 0 字节。
  • Selector.selectedKeys()用完必须remove(),否则死循环。
  • FileChannel.map一次 map 2 GB,32 位 JVM 直接 OOM。
  • 虚拟线程里用synchronized会钉死平台线程,改ReentrantLock

09 选型速查表(建议收藏)

场景推荐方案一句话理由
< 100 MB 文件顺序读写Files.newInputStream + try-with-resources简单够用
高并发网关(>1 w 连接)Netty 主从 Reactor业界验证,文档管够
超大文件拷贝(>2 GB)fileChannel.transferTo内核零拷贝,CPU 省一半
纯代理/转发,CPU 几乎不计算AIO线程数压到最低
JDK21 新项目Virtual Thread + 阻塞 IO代码最懒,性能最猛

10 结尾

把这篇文章保存为「IDEA 收藏夹」第一条,下次:

  • 同事问“Java IO 怎么选”→ 直接甩速查表;
  • 面试被问“零拷贝原理”→ 背第 4 节;
  • 线上文件传输慢 → 跑第 7 节“三板斧”,5 分钟定位。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:33:41

iOS开发工程师面试指南:从基础到前沿技术实践

xTool 移动端iOS开发工程师 职位描述 岗位职责: 1. 负责公司 iOS 平台下所有业务开发和交付 2. iOS端业务公共模块建设,包含设备、编辑器、AIOT、算法等; 3. iOS端前沿技术预演,包含不限于UX、图像、3D、AR等方向; 任职要求 1. 全日制本科及以上学历,三年以上 iOS 开发经…

作者头像 李华
网站建设 2026/6/10 16:18:30

怎么隐藏任务栏里的图标?这款免费神器,一键搞定!

前言 上班时间偶尔摸个鱼&#xff0c;或者处理一些私人事务&#xff0c;任务栏上明晃晃的窗口图标却随时可能暴露你的小秘密 其实&#xff0c;你只需要把任务栏里的特定图标隐藏起来&#xff0c;这些问题就迎刃而解了。 今天给大家分享一款专业隐藏任务栏图标的小工具&#…

作者头像 李华
网站建设 2026/6/9 22:48:15

AI原生应用领域下的AI工作流最佳实践

AI原生应用的AI工作流最佳实践:从第一性原理到落地闭环 元数据框架 标题:AI原生应用的AI工作流最佳实践:从第一性原理到落地闭环 关键词:AI原生应用、MLOps、数据工程、模型迭代、闭环工作流、特征商店、伦理AI 摘要:AI原生应用(AI-Native Application)是以人工智能为核…

作者头像 李华
网站建设 2026/6/10 14:44:49

PyTorch-CUDA-v2.6镜像更新日志:新增支持哪些功能?

PyTorch-CUDA-v2.6镜像更新日志&#xff1a;新增支持哪些功能&#xff1f; 在深度学习工程实践中&#xff0c;环境配置的复杂性常常成为项目启动的第一道门槛。尤其是当团队成员面对“我本地能跑&#xff0c;你那里报错”的窘境时&#xff0c;问题往往出在 CUDA 版本、cuDNN 兼…

作者头像 李华
网站建设 2026/5/23 16:24:52

GPU算力市场趋势分析:PyTorch开发者需求增长

GPU算力市场趋势分析&#xff1a;PyTorch开发者需求增长 在人工智能技术席卷各行各业的今天&#xff0c;一个现实问题摆在每一位开发者面前&#xff1a;如何在有限的时间内&#xff0c;快速搭建出稳定、高效的深度学习训练环境&#xff1f;尤其是在面对千亿参数大模型、分布式多…

作者头像 李华
网站建设 2026/6/10 11:43:48

GitHub Star 数量前 12 的 AI 工作流项目

原文链接&#xff1a;https://www.nocobase.com/cn/blog/top-12-ai-workflows-projects-with-the-most-github-stars 提到工作流和自动化&#xff0c;无论是开源的 n8n 、Dify&#xff0c;还是一些较为知名的商业化产品&#xff0c;例如 Zapier、Make&#xff0c;你可能都不陌…

作者头像 李华