使用Java下载文件时的合理缓冲区大小

时间:2011-09-05 13:43:50

标签: java performance optimization

使用Java传输(无论UP / DOWN)大文件(3-4演出)时使用的合理缓冲区大小是什么?

byte buf[] = new byte[1024]

byte buf[] = new byte[5 * 1024 * 1024]

有时即使您使用大缓冲区并传递给read(byte array [])方法,这也不能保证您将获得完整的5 me缓冲区。在我的测试中,我观察到每次read()调用的平均大小通常是1.5kb。这是否明智有效?如果有人能指出我更详细地讨论这个问题的资源,我会很高兴的。

2 个答案:

答案 0 :(得分:10)

听起来你正在从网络连接中读取(TCP?)

1500字节是默认的以太网MTU,这解释了为什么每次读取通常需要1.5KB。通过将网络堆栈配置为使用jumbo frames,可以将MTU增加到9KB。

考虑到这一点,使buf大于9KB几乎肯定没有意义。使用较小的缓冲区(例如超过1KB)可能会或可能不会对性能产生负面影响。

在任何情况下,获得明确答案的唯一方法是通过对各种缓冲区大小进行基准测试。

答案 1 :(得分:1)

在我的研究中测试时,使用Java 6从Linux上的套接字读取时,8K是最佳缓冲区大小。如果分配大于8K的缓冲区,则只会浪费空间。我已经读过Java使用的本机调用使用8K缓冲区,这就是为什么8K是最佳的但我丢失了我的引用。有一个错误指向这个事实,但它不是确凿的证据:http://bugs.sun.com/view_bug.do?bug_id=6444633

那就是说,尝试在你有兴趣部署的平台上进行试验,你会发现最佳的缓冲区大小。如果你很懒,8K是一个很好的默认值。