通過實測對比 6 種文件拷貝方式,發現 NIO 內存映射 (MappedByteBuffer) 速度最快,大文件優勢超 20 倍;通道傳輸 (transferTo/transferFrom) 緊隨其後;傳統流式讀寫最慢。Buffer 大小顯著影響流式讀寫性能,直接內存 allocateDirect 提升有限。
mbbo.put(mbbi)toChannel.transferFrom(fromChannel, 0, size)fromChannel.transferTo(0, size, toChannel)ByteBuffer.allocate() 循環讀寫ByteBuffer.allocateDirect() 循環讀寫byte[] + InputStream/OutputStream| 文件/Buffer | MappedByteBuffer | transferFrom | transferTo | Heap Buffer | Direct Buffer | Stream |
|---|---|---|---|---|---|---|
| 42MB / 1KB | 47 | 62 | 47 | 249 | 188 | 187 |
| 42MB / 4KB | 15 | 16 | 31 | 125 | 79 | 93 |
| 42MB / 10KB | 16 | 32 | 31 | 78 | 62 | 63 |
| 350MB / 1KB | 280 | 453 | 7785 | 8144 | 7068 | 8503 |
| 350MB / 4KB | 1904 | 5978 | 7379 | 7621 | 7474 | 8200 |
| 350MB / 10KB | 328 | 6864 | 7021 | 7199 | 7941 | 7801 |
session.setCacheMode(CacheMode.IGNORE)內存映射要求文件能完整映射進虛擬地址空間,32 位 JVM 受限 2-4GB,大文件需分段映射或改用通道傳輸。