为什么默认的char缓冲区大小为BufferedReader 8192?

时间:2016-05-24 03:51:08

标签: java bufferedreader

当我构造一个新的BufferedReader时,它为我提供了8192个字符的缓冲区。这背后的逻辑/原因是什么?

8192 = 2 to the power of 13

4 个答案:

答案 0 :(得分:4)

传统上,操作系统中的内存管理器和页面文件在大小为2的页面上工作。这允许使用左/右移位操作执行非常有效的乘/除操作。使用缓冲区时,最糟糕的情况是使用大小比页面大小长1个字节的缓冲区(这将导致额外的页面交换,效益非常低)。因此,默认缓冲区大小也倾向于以两个因子实现。

我假设(但尚未检查)JVM会查找这样的缓冲区并尝试在页面边界上对齐它们。

为什么这很重要?页面未命中非常昂贵。如果你正在做大量的IO,最好避免支持缓冲区的页面被交换到磁盘的情况(这种情况会破坏缓冲区的目的)。也就是说,对于大多数应用程序来说,这是一个微优化,对于绝大多数情况,默认情况都很好。

作为参考,Windows和Linux目前都使用4KB内存页面大小。因此BufferedReader上的默认缓冲区将只消耗2页。

答案 1 :(得分:3)

正如BufferedReader Javadoc所说

  

可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。

默认选择为"足够大" (我将解释为"足够好")。

答案 2 :(得分:1)

8192是2 ^ 13,并且还揭示了许多我们做过的关于RIGHT v WRONG编码的信息。如果删除或增加了作者的意图,他就会修改并因此破坏整个内容。尝试添加或删除一些完美的东西……祝你好运!

答案 3 :(得分:0)

正如你所说,8192是2 ^ 13。这个数字是默认值的确切原因很难得到,但我冒昧地说它是基于正常使用场景和数据效率的结合。但是,您可以使用不同的对象构造函数指定所需的缓冲区大小。

BufferedReader(Reader in, int sz)

创建一个使用指定大小的输入缓冲区的缓冲字符输入流。

https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html BufferedReader default buffer size?将提供进一步的见解。