2026/3/22 0:07:20
网站建设
项目流程
微信建网站,如何建立淘宝客网站,网站开发学什么专业,wordpress文章点不开01 为什么又要聊 IO#xff1f;
最近再做文件流传输#xff0c;发现JDK更新新的东西#xff0c;而网上都还没有具体的应用方法。 现在 JDK 21 已 GA#xff0c;虚拟线程官宣“同步代码跑出异步性能”#xff0c;于是有了这篇“2025 版全家桶”。 不管你是刚学 Java 的本科…01 为什么又要聊 IO最近再做文件流传输发现JDK更新新的东西而网上都还没有具体的应用方法。现在 JDK 21 已 GA虚拟线程官宣“同步代码跑出异步性能”于是有了这篇“2025 版全家桶”。不管你是刚学 Java 的本科生还是天天调网关的社畜都能 10 分钟看完、5 分钟定位线上慢 IO。02 全景地图一图胜千言BIO同步阻塞 → NIO同步非阻塞 → AIO异步回调 → 虚拟线程阻塞代码纤程把鼠标滚轮锁死下面按顺序展开。03 BIO 还没死如何用出“高级感”try-with-resources 是底线别再手写finally close()。InputStream.transferTo(OutputStream)是 JDK 9 送的零拷贝语法糖8 行代码缩成 1 行。字符集请用StandardCharsets.UTF_8别再catch UnsupportedEncodingException骗自己。网络传输先套BufferedInputStream再套GZIPInputStream顺序反了性能掉 30%。04 NIO 三板斧Buffer、Channel、SelectorDirectBuffer vs HeapBuffer实验4 MB 文件DirectBuffer 比 HeapBuffer 少 35% cache-miss。代价分配慢、不受 GC 管记得加-XX:MaxDirectMemorySize别等 OOM 再百度。零拷贝“两板斧”fileChannel.transferTo()—— 内核 sendfile用户态 0 拷贝。FileChannel.map()—— 大文件随机读写像操作数组单机 10 Gbps 打满 CPU 还能剩 70%。Reactor 模型手绘版MainReactor→只 accept ↓ SubReactor→真正 read/writeNetty 默认就是这个套路8 核 16 G 云主机轻松 100 w 并发。05 AIO真异步但别乱用AsynchronousSocketChannelCompletionHandler确实能把线程数压到几十代价是“回调地狱”“调试断点找不到北”。除非写代理网关、计算量极轻否则 Reactor 更简单。06 虚拟线程JDK21 的“降维打击”代码还是最古老的阻塞写法try (var executor Executors.newVirtualThreadPerTaskExecutor()) { executor.submit(() - { var in socket.getInputStream(); // 阻塞读 }); }底层把 1 w 个虚拟线程挂到 1 个平台线程上阻塞操作不再占内核栈。官方 benchmarkTomcat NIO 7 w QPS → Virtual Thread 12 w QPS延迟还降一半。结论新项目直接上 JDK21写完同步代码就可以去喝茶。07 线上排查“三板斧”strace -c -e trace%network java App看read/write系统调用次数比业务预期高 1 个量级 → 没加 Buffer。perf stat -e cache-misses对比 DirectBuffer 与 HeapBuffermiss 差 35% 以上就能拍板换 Direct。jstack | grep parking to wait线程都卡在park→ 连接数 线程池上 Selector 或虚拟线程。08 避坑 20 秒速记BufferedOutputStream忘记flush()文件 0 字节。Selector.selectedKeys()用完必须remove()否则死循环。FileChannel.map一次 map 2 GB32 位 JVM 直接 OOM。虚拟线程里用synchronized会钉死平台线程改ReentrantLock。09 选型速查表建议收藏场景推荐方案一句话理由 100 MB 文件顺序读写Files.newInputStream try-with-resources简单够用高并发网关1 w 连接Netty 主从 Reactor业界验证文档管够超大文件拷贝2 GBfileChannel.transferTo内核零拷贝CPU 省一半纯代理/转发CPU 几乎不计算AIO线程数压到最低JDK21 新项目Virtual Thread 阻塞 IO代码最懒性能最猛10 结尾把这篇文章保存为「IDEA 收藏夹」第一条下次同事问“Java IO 怎么选”→ 直接甩速查表面试被问“零拷贝原理”→ 背第 4 节线上文件传输慢 → 跑第 7 节“三板斧”5 分钟定位。