首页 > 试题广场 > 什么是Java虚拟机?为什么Java被称作是“平台无关的编程
[问答题]
什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
java的跨平台不是java源程序的跨平台 ,如果是这样,那么所以语言都是跨平台的, java源程序先经过javac编译器编译成二进制的.class字节码文件(java的跨平台指的就是.class字节码文件的跨平台,.class字节码文件是与平台无关的),.class文件再运行在jvm上,java解释器(jvm的一部分)会将其解释成对应平台的机器码执行,所以java所谓的跨平台就是在不同平台上安装了不同的jvm,而在不同平台上生成的.class文件都是一样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行。 最后解释下机器码和字节码的区别: 一,机器码,完全依附硬件而存在~并且不同硬件由于内嵌指令集不同,即使相同的0 1代码 意思也可能是不同的~换句话说,根本不存在跨平台性~比如~不同型号的CPU,你给他个指令10001101,他们可能会解析为不同的结果~ 二,我们知道JAVA是跨平台的,为什么呢?因为他有一个jvm,不论哪种硬件,只要你装有jvm,那么他就认识这个JAVA字节码~~~~至于底层的机器码,咱不用管,有jvm搞定,他会把字节码再翻译成所在机器认识的机器码~~~

---------------------------------------------------------------
评论里看到有个问题问的很好,这里再回答一波

编辑于 2019-06-18 20:03:32 回复(46)
java虚拟机(jvm)是可以执行java字节码的虚拟进程。 准确的来说,java的跨平台指的是java源文件经过javac编译器编译成的二进制.class字节码的跨平台性。各个平台装有不同的jvm,而jvm能将相同的字节码翻译成平台相关的机器码,进而执行。
编辑于 2017-07-27 10:38:28 回复(11)
虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如 处理器 堆栈 寄存器 等,还具有相应的 指令 系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码( 字节码 ),就可以在多种平台上不加修改地运行。
发表于 2016-03-21 10:45:19 回复(1)
JAVA 虚拟机就是一个过度,就像一个人会说各个国家的语言,那末我只要带着这个人,不论走到哪里都可以说汉语,别人都可以听懂,因为我们只需要关心我们的表达,至于和不同的平台,交给这个人就可以,这个人就是虚拟机。
编辑于 2016-03-15 22:38:54 回复(4)

平台无关性就是一种语言在计算机上的运行不受平台的约束,一次编译,到处执行(Write Once ,Run Anywhere)。

也就是说,用Java创建的可执行二进制程序,能够不加改变的运行于多个平台。

平台无关性好处

作为一门平台无关性语言,无论是在自身发展,还是对开发者的友好度上都是很突出的。

因为其平台无关性,所以Java程序可以运行在各种各样的设备上,尤其是一些嵌入式设备,如打印机、扫描仪、传真机等。随着5G时代的来临,也会有更多的终端接入网络,相信平台无关性的Java也能做出一些贡献。

对于Java开发者来说,Java减少了开发和部署到多个平台的成本和时间。真正的做到一次编译,到处运行。

平台无关性的实现

对于Java的平台无关性的支持,就像对安全性和网络移动性的支持一样,是分布在整个Java体系结构中的。其中扮演者重要的角色的有Java语言规范、Class文件、Java虚拟机(JVM)等。

编译原理基础

讲到Java语言规范、Class文件、Java虚拟机就不得不提Java到底是是如何运行起来的。

在计算机世界中,计算机只认识0和1,所以,真正被计算机执行的其实是由0和1组成的二进制文件。(Java代码的编译与反编译那些事儿)

但是,我们日常开发使用的C、C++、Java、Python等都属于高级语言,而非二进制语言。所以,想要让计算机认识我们写出来的Java代码,那就需要把他”翻译”成由0和1组成的二进制文件。这个过程就叫做编译。负责这一过程的处理的工具叫做编译器。

在Java平台中,想要把Java文件,编译成二进制文件,需要经过两步编译,前端编译和后端编译(深入分析Java的编译原理):

前端编译主要指与源语言有关但与目标机无关的部分。Java中,我们所熟知的javac的编译就是前端编译。除了这种以外,我们使用的很多IDE,如eclipse,idea等,都内置了前端编译器。主要功能就是把.java代码转换成.class代码。

这里提到的.class代码,其实就是Class文件。

后端编译主要是将中间代码再翻译成机器语言。Java中,这一步骤就是Java虚拟机来执行的。

所以,我们说的,Java的平台无关性实现主要作用于以上阶段。如下图所示:

我们从后往前介绍一下这三位主演:Java虚拟机、Class文件、Java语言规范

Java虚拟机

所谓平台无关性,就是说要能够做到可以在多个平台上都能无缝对接。但是,对于不通的平台,硬件和操作系统肯定都是不一样的。

对于不同的硬件和操作系统,最主要的区别就是指令不同。比如同样执行a+b,A操作系统对应的二进制指令可能是10001000,而B操作系统对应的指令可能是11101110。那么,想要做到跨平台,最重要的就是可以根据对应的硬件和操作系统生成对应的二进制指令。

而这一工作,主要由我们的Java虚拟机完成。虽然Java语言是平台无关的,但是JVM确实平台有关的,不同的操作系统上面要安装对应的JVM。

上图是Oracle官网下载JDK的指引,不同的操作系统需要下载对应的Java虚拟机。

有了Java虚拟机,想要执行a+b操作,A操作系统上面的虚拟机就会把指令翻译成10001000,B操作系统上面的虚拟机就会把指令翻译成11101110。

 ps:图中的Class文件中内容为mock内容

所以,Java之所以可以做到跨平台,是因为Java虚拟机充当了桥梁。他扮演了运行时Java程序与其下的硬件和操作系统之间的缓冲角色。

字节码

各种不同的平台的虚拟机都使用统一的程序存储格式——字节码(ByteCode)是构成平台无关性的另一个基石。Java虚拟机只与由自己码组成的Class文件进行交互。

我们说Java语言可以Write Once ,Run Anywhere。这里的Write其实指的就是生成Class文件的过程。

因为Java Class文件可以在任何平台创建,也可以被任何平台的Java虚拟机装载并执行,所以才有了Java的平台无关性。

Java语言规范

已经有了统一的Class文件,以及可以在不同平台上将Class文件翻译成对应的二进制文件的Java虚拟机,Java就可以彻底实现跨平台了吗?

其实并不是的,Java语言在跨平台方面也是做了一些努力的,这些努力被定义在Java语言规范中。

比如,Java中基本数据类型的值域和行为都是由其自己定义的。而C/C++中,基本数据类型是由它的占位宽度决定的,占位宽度则是由所在平台决定的。所以,在不同的平台中,对于同一个C++程序的编译结果会出现不同的行为。

举一个简单的例子,对于int类型,在Java中,int占4个字节,这是固定的。

但是在C++中却不是固定的了。在16位计算机上,int类型的长度可能为两字节;在32位计算机上,可能为4字节;当64位计算机流行起来后,int类型的长度可能会达到8字节。(这里说的都是可能哦!)

通过保证基本数据类型在所有平台的一致性,Java语言为平台无关性提供强了有力的支持。

小结

对于Java的平台无关性的支持是分布在整个Java体系结构中的。其中扮演者重要的角色的有Java语言规范、Class文件、Java虚拟机等。

  • Java语言规范
    • 通过规定Java语言中基本数据类型的取值范围和行为
  • Class文件
    • 所有Java文件要编译成统一的Class文件
  • Java虚拟机
    • 通过Java虚拟机将Class文件转成对应平台的二进制文件等

Java的平台无关性是建立在Java虚拟机的平台有关性基础之上的,是因为Java虚拟机屏蔽了底层操作系统和硬件的差异。


发表于 2019-11-27 23:58:33 回复(1)
JVM可以看做是一台抽象的计算机,拥有自己的指令集和各种运行时的内存区域。

Java之所以被称为平台无关的语言,是由于其通过JVM屏蔽了与具体平台相关的信息,使得Java编译时只需要生成在JVM上运行的目标代码(字节码),由虚拟机在具体平台运行。从而实现一次编译,处处执行。

发表于 2016-05-18 21:50:07 回复(2)
Java语言的跨平台并不是指Java语言本身跨平台,而是Java源程序编译后的字节码文件的跨平台,Java程序执行过程是Java源文件编译成.class字节码文件,再由jvm翻译成不同操作平台的机器码并执行,跨平台就是在不同操作平台安装不同的jvm,而字节码文件都是一样的,这是因为jvm屏蔽所有有关操作平台的信息,字节码文件翻译成机器码这个过程由jvm自主自动完成,我们只需要写源代码,再交由Javac编译成字节码文件即可。 jvm是抽象化的计算机,包含了指令集,寄存器,堆,栈,方法区,垃圾回收,jvm负责将Java字节码文件翻译成不同操作平台的机器码。
编辑于 2018-04-17 12:41:04 回复(0)
一次编译,永久运行,说的就是这个道理。.class是亲儿子,无论走到哪儿,jvm爸爸都不会认错。
发表于 2018-01-30 21:01:48 回复(3)
Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。
Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
发表于 2015-10-29 12:10:41 回复(0)

Java虚拟机是一个可以执行Java字节码的虚拟进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。

Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者重新编译。因为Java源码经过jvm编译后得到class字节码,运行在jvm上,然后经过jvm将class文件解释称对应平台的机器码执行。所以Java程序被称作为“平台无关的编程语言”,也被叫做“一处编译,处处运行”。Java虚拟机让这变成可能,因为它知道底层硬件平台的指令长度和其他特性。

发表于 2018-08-26 22:08:05 回复(0)
虚拟机就是给java提供一个运营环境,java可以在各平台通过虚拟机运行,所以跨平台性很好,平台对其限制很小
发表于 2017-07-11 07:07:22 回复(0)
java虚拟机可以执行java字节码文件,java源文件可以被虚拟机改为字节码文件从而能在各平台上运用不需程序员针对其进行调整,应为java虚拟机对硬件特性的了解
发表于 2019-12-23 07:48:44 回复(0)
jvm是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被jvm执行的字节码文件。
Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。JVM让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性……
发表于 2019-10-29 16:22:37 回复(0)

Java虚拟机是java的运行环境,可以运行在不同环境

发表于 2019-10-15 21:00:29 回复(0)

有很高的便利性,很方便,但是,也有很大的局限性,比如,存储的数量与大小,以及安全性,可以保存一些不重要,常用的数据

发表于 2019-10-11 18:28:40 回复(0)
一个java源文件被javac编译成.class字节码文件,.class文件又可以在jvm上执行,执行为机器码,被机器所识别
发表于 2019-08-23 23:58:24 回复(0)

JVM能将字节码翻译成字节码

Java之所以是平台无关性语言是因为JVM的存在,不同的平台安装了不同的JVM,相同的字节码文件可以被不同的JVM翻译成当前机器能理解的机器码

发表于 2019-08-21 14:26:20 回复(0)
针对不同的操作系统提供不同的JVM,所以一个java程序在不同的操作系统中都可以执行这样就实现了java程序的跨平台性
发表于 2019-07-14 20:09:55 回复(0)

java虚拟机可以编译java文件,在运行


发表于 2019-07-03 12:41:47 回复(0)
.class 字节码可以被不同机器上安装的虚拟机所识别,但是机器码在每种机器上代表的指令都可能是不同的,虚拟机的作用就是将平台
无关的字节码,翻译成各种机器能够识别的机器码,进而进行解释执行或者 JIT执行。
发表于 2019-04-16 09:44:06 回复(0)