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

San*_*hra 5 java bufferedreader

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

8192 = 2 to the power of 13
Run Code Online (Sandbox Code Playgroud)

Kev*_*Day 6

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

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

为什么这么重要?页面丢失非常昂贵。如果您要处理大量的IO,则最好避免将支持缓冲区的页面换出到磁盘的情况(这种做法会破坏缓冲区的用途)。就是说,对于大多数应用程序来说,这是一个微优化,对于大多数情况,默认值是可以的。

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


Ell*_*sch 5

正如BufferedReaderJavadoc所说

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

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