我很好奇知道当Java变成平台无关的时候,JVM为什么还是平台相关的。
JVM执行Java代码,但是它是用诸如C/C++/ASM等平台特定语言编写的。JVM并非用Java编写,因此不能做到跨平台。
mmap
VM映像,将mmap
地址写入映像中的特定位置,然后跳转到映像内的预定义位置。第二个地方是调试器:Maxine使用平台本地的调试工具,之所以使用C语言编写是因为它们从GDB中提取出来的,因为平台文档太糟糕了,无法从头开始编写调试器。第三个地方是非常低级别的线程代码:Maxine使用本地线程。 - Jörg W Mittag我发现这是一个非常好的问题答案:
JVM将字节码翻译成机器语言
每个Java程序都被编译成一种称为Java字节码的中间语言。JVM用于将字节码翻译成特定计算机的机器语言,并实际执行相应的机器语言指令。JVM和字节码结合在一起,使Java成为“可移植”语言。
机器语言依赖于操作系统
结合前面提到的信息,可以更容易地得出答案。由于JVM必须将字节码翻译成机器语言,并且由于机器语言取决于使用的操作系统,因此很明显JVM是平台(操作系统)相关的。通过尝试下载JVM可以验证这一点 - 您将会看到针对不同操作系统的JVM列表,并且您需要选择针对正在运行的操作系统的JVM。
引用自JVM是否平台相关?
除非你有一种可以直接执行Java字节码的CPU(确实有这样的东西),否则你需要能够与操作系统进行交互(例如读取文件,连接到网络,向屏幕显示等)。
你可以使用其他语言(如Java或JavaScript)编写JVM,但最终仍需要有某些东西能够与底层操作系统进行交互。
JVM 必须是平台相关的,以便让您的 Java 在特定平台上运行。Windows 的 JVM 会将您的 Java 翻译成不同于 OS X 的系统调用。
JVM依赖于操作系统。为了使代码独立,需要有一些东西是依赖的,这就是JVM。在下载JDK时,它会询问您要为哪个操作系统下载。这清楚地说明JVM是平台相关的。
JVM不是平台无关的。
关键在于JVM依赖于操作系统-因此,如果您运行的是Mac OS X,则拥有的JVM与如果您运行Windows或其他操作系统时所拥有的JVM不同。这个事实可以通过尝试为特定机器下载JVM来验证-当尝试下载它时,您将会得到一个对应于不同操作系统的JVM列表,并且显然会选择针对您正在运行的操作系统定位的JVM。
简单来说 - * - 变成了 +。
我们都知道 Java 是跨平台的
但是我们编写代码的操作系统是平台相关的
而输出应该是跨平台的,因此我们使 jvm(介于 jre 中并安装在其中)与平台相关,以便输出独立。