什么是jvm?
运行字节码的虚拟机,针对不同的操作系统有特定的实现。
好处?
可以编译成字节码的语言的实现跨平台,即一次编译各处执行。以java语言为例
- 源码先通过javac编译成.class字节码,然后通过类加载器将字节码文件加载到虚拟机中,最后JVM对字节码文件进行翻译成机器可以识别的二进制文件。
- Jvm对字节码文件的处理过程是解释过程。
所以我们说 Java 是编译与解释共存的语言。
编译型和解释型
高级语言转化成机器码根据处理的时间不同可以分为两类:编译型和解释型。
1.编译型
编译型语言在第一次编译时,就会把一次性编译成机器语言的,所以可以脱离开发环境独立运行,而且通常运行效率较高。但因为编译型语言的程序被编译成特定平台上的机器码,因此编译生成的可执行程序通常无法移植到其他平台上运行,如果需要移植,则必须将源代码复制到特定平台上,针对特定平台进行修改,至少需要采用特定平台上的编译器重新编译。
优缺点:1)一次性编译,效率高,可脱离编译器运行;
2)但是由于针对特定平台实现,所以无法将生成的可执行文件在其他平台运行,需要将源程序移植到其他平台并针对该平台的特性修改,使用该平台特定编译器进行编译。
2. 解释型
解释型语言通常不会进行整体性的编译和链接处理,每次执行解释型语言的程序都需要进行一次编译。
优缺点:1)运行效率通常较低,而且不能脱离解释器独立运行。
2)优势,就是跨平台比较容易,只需提供特定平台的解释器即可,每个特定平台上的解释器都负责将源程序解释成特定平台的机器指令。
3. JVM中对运行效率的优化
为了解决效率问题,jvm引进了 JIT 编译器,由于有些方法和代码块是经常需要被调用的(也就是所谓的热点代码,HotSpot采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码)),当 JIT 编译器完成第一次编译后,其会将热点代码的字节码对应的机器码保存下来,下次可以直接使用。
JDK 9引入了一种新的编译模式AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了JIT预热等各方面的开销。JDK支持分层编译和AOT协作使用。但是 ,AOT 编译器的编译质量是肯定比不上 JIT 编译器的。
4.JDK、JRE
JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java虚拟机(JVM),Java类库,java命令和其他的一些基础构件。但是,它不能用于创建新程序。
JDK除了包含JRE,还有编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序。