大家都知道 Tomcat 用NIO 处理瞬时高并发
(一个Selector 监听多个Channel,一个线程
管几千连接),但Tomcat 它还用NIO解决了
另外三个生产问题:
- Zero-Copy文件传输
处理静态文件时,用FileChannel.transferTo()
实现零拷贝。传统IO要经过4次数据拷贝(文
件→内核→用户空间→ Socket→网卡),
零拷贝直接让内核把文件从磁盘搬到网卡,拷
贝次数降到2次,CPU和内存占用都大幅下
降。下载大文件、CDN静态资源分发场景下性
能提升明显。
2.超时检查防慢客户端
每个连接记录lastRead和lastWrite时间戳,
Poller 线程每轮检查(now- lastRead)(从上次读
到数据到现在,过了多久)大于 timeout就主
动断开。防止慢客户端(网络差、恶意攻击)
长时间占着连接不发数据,把服务器连接池耗
光。公网服务必备,特别是移动端网络不稳定
时。 - Channel 对象池减少GC
用SynchronizedStack缓存NioChannel和
ByteBuffer,连接关闭时不是直接销毁,而是
reset)后放回池子复用。高并发场景下,频繁
创建/销毁这些对象会触发大量 Young ,对
象池能让GC 频率下降不少的。
小结:Tomcat 用NIO不只是扛并发,还处理
了文件传输效率、资源耗尽风险、GC压力三
个实际问题。日常开发中,可以根据业务需求
实际情况,进行借用。
请登录后发表评论
注册
停留在世界边缘,与之惜别