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

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

 8192 = 2 to the power of 13 

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

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

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

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

正如BufferedReader Javadoc所说

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

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

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

 BufferedReader(Reader in, int sz) 

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

https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html和BufferedReader的默认缓冲区大小? 将提供进一步的见解。