Java版本和JVM之间的区别在哪里?

时间:2010-01-14 14:00:55

标签: java jvm

Java版本与JVM之间的区别究竟在哪里?

我问的是因为最近有一个关于java.io.BufferedInputStream的默认缓冲区大小的SOpedian的'教育'评论主题,我看到它是8192.(它一直是8192吗?)当考虑到时API,很明显是什么。但是使用java.*类的实现 ...我只是不知道。

这导致了两个衍生问题:

  • BufferedInputStream的Java版本之间的默认缓冲区大小是否会发生变化?
  • 各个供应商的JVM上BufferedInputStream的默认缓冲区大小可能不同吗?

(当然还有其他类似的例子,比如各种集合的实现。)

4 个答案:

答案 0 :(得分:6)

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

这意味着默认缓冲区大小可以在Java版本之间以及相同Java规范的不同实现之间更改。

在其他方面几乎相同:真正的规范是文档(即JLS,JVM规范和API规范,或者更确切地说是相应的JCP)。

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

答案 1 :(得分:2)

“Java”是一种语言和API规范。 JVM由完全不同的规范覆盖,该规范描述了类文件的格式以及字节码的工作方式。

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

API的实现可以并且确实在修订之间发生变化,以响应错误报告和一般清理。

答案 2 :(得分:1)

基本上该行是规范,主要在Java doc中。该规范概述了API的合同,并且实施必须遵守该合同。合同未指定的内容取决于实施。

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

答案 3 :(得分:-1)

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