Home Tags Posts tagged with "编译,解释,热点代码,JVM,字节码"

编译,解释,热点代码,JVM,字节码

JVM

Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,linux,macOS);

目的:使用相同的字节码,它们会给出相同的结果;

那么什么是字节码呢?为什么要采用字节码呢?

字节码:在Java种,JVM可以理解的代码就叫字节码(扩展名为.class),不面向任何特定的处理器,只面向虚拟机,即只对虚拟机负责。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java程序无须重新编译便可在多种不同操作系统的计算机上运行;(跨平台性)

Java程序从源代码到运行的三步:

.java文件(源文件)   通过JDK中的Javac编译    —>.class文件(字节码文件)   JVM运行   —>机器可执行的二进制机器码;

注意.class->机器码这一步

加载:在这一步JVM类加载器首先加载字节码文件;

解释:然后通过解释器逐行解释执行;

为什么说Java解释与编译共存?

这种方式的执行速度相对较慢。有些方法和代码块是经常需要被调用的(所谓的热点代码),所以后面引进了JIT编辑器;

JIT编辑器属于运行时编译;当JIT编译器完成第一次编译后,其会将字节码对应的机器码保存起来,下次可以直接使用,由于机器码的运行效率肯定高于Java解释器,因此运行效率得以提升;这也解释了为什么我们常说Java是编译和解释共存的语言;

补充:解释和编译的区别:(二者都是生成目标平台的指令)
1,编译型语言在编译过程中生成目标平台的指令,解释型语言在运行过程中才生成目标平台的指令。
2,虚拟机的任务是在运行过程中将中间代码翻译成目标平台的指令。

那么什么时候选择编译?什么时候又选择解释呢?

对于程序来说,通常只有一部分代码会被经常执行,而应用的性能主要取决于这些代码执行的有多快;这些关键代码被成为应用的热点代码(比如QQ的聊天发送代码,聊天接收代码),执行得越多则越热;

因此JVM执行代码时,并不会无脑编译;

情况1.如果代码只执行一次,那么选择解释更快(边运行边翻译,因为对于只执行一次的代码解释执行Java字节码比先编译再执行的速度快);

情况2.如果代码是热点代码,经常被调用,那么选择编译(先翻译完再执行)更快,多次执行积累节约的时间远超编译一次所耗费的时间,则编译更快;

这种权衡是编译器先解释执行代码的原因之一:编译器可以找到哪个方法被调用的足够频繁,然后进行编译;

第二个理由:为了优化:JVM执行特定方法或者循环的次数越多,它就越了解这段代码,使得JVM在编译代码时进行大量优化;