2010-01-14 129 views
3

Java的版本和JVM之间的界限究竟在哪里?Java的版本和JVM之间的区别究竟在哪里?

我在问最近一个关于默认缓冲区大小java.io.BufferedInputStream的“教育”评论主题,我看到它是8192.(它总是8192吗?)当只考虑API时,什么是明确的。但与实施java.*类...我只是不知道。

这导致两个衍生问题:

  • 莫非BufferedInputStream的默认缓冲区大小的Java版本之间的变化?
  • 可能BufferedInputStream的默认缓冲区大小在不同供应商的JVM上会有所不同?

(当然还有其他的类似的例子,如在不同的集合的执行。)

回答

6

由于the API specification of BufferedInputStream未指定值,因此完全取决于实施选择一个值。

这意味着默认缓冲区大小可以在Java版本之间以及相同Java规范的不同实现之间变化。在其他领域几乎相同:真正的规范是文档(即JLS,JVM规范和API规范,或者相应的JCP)。

其他所有内容(即您查看源代码时可以看到的所有内容)都是实现细节,具体取决于它是一个错误。

+0

谢谢。这只会让我对“BufferedInputStream”的历史信息产生兴趣。在JDK1.1的JavaDocs中,它明确指出默认缓冲区是512KB,但对默认大小的任何引用都从它们的输出中消失。有趣的东西。 – 2010-01-15 13:02:12

1

基本上线是说明书中,其中大部分是在Java文档。该规范概述了API的合同,并且实施必须遵守该合同。合同没有具体说明的将取决于实施。

当然,实际上没有规范是完美的,所以即使没有指定,也有依赖的实用细节。 Joel Spolsky在其上有一个good article,但在Java中比W3C要好得多。

2

“Java”是一种语言和API规范。 JVM有一个完全不同的规范,它描述了类文件的格式和字节码的工作方式。

要被称为“Java”,实现必须通过由Sun和JCP定义的一系列测试。这些测试没有提到API或JVM的内部实现。

为了响应错误报告和一般清理,API的实现可以并在修订之间进行更改。

-1

Java是语言。这是一个规范。
JVM是一种软件,可以执行Java字节码。有一个规范。
JVM的许多实现(Sun的,IBM的和手机的各种迷你版本等),并且有许多Java的实现。可以将Java语言编译为字节码,但并不一定,它可以编译为IL(for。净CLR)或本地代码或其他任何东西。
JVM不必运行Java应用程序,例如参见Jython和JRuby以及其他许多示例

相关问题