Java sendFile 底层实现
前言
Java send file api 是 transferTo 方法和 transferFrom 方法。
注意:send file 是一个从磁盘到网卡驱动的 IO 优化。反过来,网卡到磁盘,是没有这个 IO 优化的。也就是说 transferFrom 方法并没有这种福利。
本文将稍稍深入,看看 Java 如何实现,注意,本文代码版本为 openjdk-8u40-src-b25-10_feb_2015。
transferFrom 解析
那么 transferFrom 底层是什么呢?简单说,就是使用了 MMAP 和 堆外内存而已。
image
上面的 transferFrom 方法代码中:
如果是普通 FileChannel 的话,就走 mmap,否则,走堆外内存,例如我们本次使用的 SocketChannelImpl。
transferFrom by mmap 细节:
image
简单来讲,在一个循环中,每次就是将 源文件根据 position 映射为一个 mmap,最大 8M