浅认知jvm
"一次编译、到处运行" 说的是Java语言跨平台的特性, Java的跨平台特性与Java虚拟机的存在密不可分,可在不同的环境中运行。比如说Windows平台和Linux平台都有相应的JDK,安装好JDK后也就有了Java语言的运行环境。其实Java语言本身与其他的编程语言没有特别大的差异,并不是说Java语言可以跨平台,而是在不同的平台都有可以让Java语言运行的环境而已,所以才有了Java一次编译,到处运行这样的效果。 严格的讲,跨平台的语言不止Java一种,但Java是较为成熟的一种。
解释还是编译?
总结:
Java是一门解释型和编译型共存的语言,首先会将 java代码编译成字节码文件,字节码文件在 jvm里是以解释型的方式执行,然后 jdk的 hotsopt 虚拟机中给我们提供了 jit (即时编译器),在运行过程中将一部分热点代码编译为机器码,加快我们的执行效率。
Java还是一门静态型的强类型的语言。
我们经常听说一门语言是解释型还是编译型的语言,那么java呢?。
-
解释型:代码没有编译的过程,读一行执行一行,比如我们以后要学习的javascreipt。
-
编译型:运行之前需要将代码先编译成【机器指令】,再运行,比如c语言。
我们都知道java是存在编译过程的,但是java的编译和c语言不一样,java不是编译成具体的【机器指令】,因为不同的硬件结构和操作系统有不同的机器指令,java为了实现【一次编写、随处运行】的目标,实际上编译出的指令是【字节码】,字节码只能由jvm识别,我们的硬件是无法识别的,运行的过程却是由jvm使用解释的方式执行。
但是为了提升效率,jvm推出了JIT(Just In Time Compile 即时编译器),就是在运行过程中,能将部分热点代码,直接编译成机器码,加快执行效率。甚至在java9中提出了AOT编译器(Ahead Of Time,指运行前编译)。
所以到目前为止,在 JVM 中有三个非常重要的编译器,它们分别是:前端编译器、JIT 编译器、AOT 编译器。
-
前端编译器,最常见的就是我们的 javac 编译器,其将 Java 源代码编译为 Java 字节码文件。
-
JIT 即时编译器,最常见的是 HotSpot 虚拟机中的 Client Compiler 和 Server Compiler,其将 Java 字节码编译为本地机器代码。
-
AOT 编译器则能将源代码直接编译为本地机器码。
-
JIT:吞吐量高,有运行时性能加成,可以跑得更快,并可以做到动态生成代码等,但是相对启动速度较慢,并需要一定时间和调用频率才能触发 JIT 的分层机制。
-
AOT:内存占用低,启动速度快,可以无需 runtime 运行,直接将 runtime 静态链接至最终的程序中,但是无运行时性能加成,不能根据程序运行情况做进一步的优化。
而在 JVM 中,通过这几种不同方式的配合,使得 JVM 的编译质量和运行速度达到最优的状态。
- 静态类型语言:变量定义时有类型声明的语言。
(1)变量的类型在编译的时候确定
(2)变量的类型在运行时不能修改
这样编译器就可以确定运行时需要的内存总量。 例如:C、Scala、Java、F#语言是静态类型语言。
- 动态类型语言:变量定义时无类型声明的语言。
(1)变量的类型在运行的时候确定
(2)变量的类型在运行可以修改
例如:python、Javascript、Ruby语言是动态类型语言。
var i = 1;
i = "123";
i = 1.2;
-
强类型定义语言:一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。强类型定义语言是类型安全的语言。
-
弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。
java是一门静态的强类型语言。

浙公网安备 33010602011771号