为什么默认的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的默认缓冲区大小? 将提供进一步的见解。