我们常说的Compile once, run anywhere,也就是Java的跨平台特性,Java的跨平台特性与JVM的存在密不可分,理解如下。
1、跨平台特性的解释
其实Java语言本身与其他的编程语言没有特别大的差异,那么相同的字节码文件如何在不同的平台上运行呢(不同平台的机器码指令不同)?并不是说Java语言本身就可以跨平台,而是在不同的平台都有可以让Java语言运行的环境(JVM)。
举个例子:我们日常家庭的用电电压220V(.class字节码文件),但是不同的用电器(操作系统平台)能承受的最大电压不同,手机10V,电视110V,电灯电压12V,那么怎么才能使不变的220V电压适应纷繁复杂的用电器呢?答案就是为每一种用电器使用对应的电源适配器(JVM),把220V转换成该用电器能承受的合适电压。
2、从源码到运行的流程
(1)编码
我们使用Java语言编写的.java文件
(2)编译
把.java文件转换成.class字节码文件
(3)解释
负责解释执行字节码的是JVM,JVM将这些字节码文件加载进来,加载进来一句,就解释一句,解释出来一句就执行一句,相当于是解释和执行是同步执行的,这种模式被称为解释执行。
注意: 解释执行这个过程并不会产生目标文件,也就是说这些可以被平台执行的机器码文件并没有生成,下次如果还是这部分代码被执行的时候,还需要重新的被解释一遍,这样每次都重复这个过程就会很耗时,因此java引入了JIT,(在程序运行时) 将那些执行比较频繁的代码,也被称作热点代码,编译成为机器码,这个时候其实内存中是保存了一部分这部分机器码的,这样就解决了上面所描述的问题。