我一直在为一篇关于
java.io.BufferedInputStream
和缓冲区的博客文章进行一些研究。 显然,多年来,默认值已经从区区 512 字节增长到 Sun 的 Java 7 实现的 8192 字节,甚至在 JDK 1.1.8 中的 JavaDocs 中明确指定。 我的问题还提出了“谁/什么决定默认值应该是什么”的问题——它并不像我预期的那样黑白分明。
我很好奇每个版本发布时的默认缓冲区大小是多少,以及在其他奇异的 JVM 中可能是什么。 到目前为止,我已经通过源代码、JavaDocs 或 Sun bug 报告找到了 1.0、1.1、1.4、Java 5、Java 6 和 (再次推测) Sun 的 Java 7 JVM。
我没能找到这个值 Sun JDK 1.2 的 JVM 实现
Sun JDK 1.3 的实现任何其他实现的价值(例如 IBM 或其他)
import java.io.BufferedInputStream;
import java.io.InputStream;
public class BufferSizeDetector extends BufferedInputStream {
public static void main(String[] args) {
BufferSizeDetector bsd = new BufferSizeDetector(null);
System.err.println(System.getProperty("java.version"));
System.err.println(bsd.getBufferSize());
}
public BufferSizeDetector(InputStream in) {
super(in);
}
public int getBufferSize() {
return super.buf.length;
}
}
Mac OS X Tiger 10.7.0,Apple 提供的默认 VM:
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-383-11A511)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-383, mixed mode)
1.6.0_26
8192
系统:
Linux wart 2.6.33-rc1-00225-gc9f937e #2 Wed Dec 23 17:55:01 UTC 2009 armv5tel GNU/Linux
OpenJDK Runtime Environment (IcedTea6 1.4.1) (6b14-1.4.1-0ubuntu10)
OpenJDK Core VM (build 14.0-b08, interpreted mode)
1.6.0_0
8192
我不确定您希望从中学到什么,但既然它就在我面前...win32 IBM 1.4.2 JRE 使用的缓冲区大小为
2048
。
在 Windows 7 中从我的 IntelliJ 运行:
JRE:1.8.0_112-release-724-b6 amd64
Windows 7 6.1
1.8.0_121
8192
$ java BufferSizeDetector
21.0.5
8192
$ java --version
openjdk 21.0.5 2024-10-15 LTS
OpenJDK Runtime Environment Temurin-21.0.5+11 (build 21.0.5+11-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.5+11 (build 21.0.5+11-LTS, mixed mode, sharing)