JVM的概念性理解

1:解释器/编译器

我们需要格外注意的是:.class->机器码(一串二进制) ,这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行(慢)+JIT运行时编译,下次可以直接使用(快)。所以机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说【Java 是编译与解释共存的语言】 。

解释器:程序需要迅速启动和执行时立即开始工作,默认选择的方式,一行一行地将字节码解析成机器码,解释到哪就执行到哪,这样执行效率很差。狭义地说,就是for循环100次,你就要将循环体中的代码逐行解释执行100次。
即时编译器(Just-In-Time Compiler:JIT):需要执行的字节码属于热点代码【jvm启动程序时,解释器顺序处理当前要运行的字节码,每处理一行字节码都会根据热点代码的算法进行计数,如果当前处理的这行字节码达到一定次数的则会被认定为是热点代码,将会把这行字节码交给编译器处理】时才会触发。JIT算法会对这段热点代码进行分析(一般是一个函数,而不是像解释器一行一行的处理字节码),以方法为单位,将热点代码的字节码一次性转为机器码,并在本地缓存起来的工具,避免了部分代码被解释器逐行解释执行的效率问题。

解释器和编译器各有各的优点(乌龟赛跑):
解释器优点:当程序需要迅速启动的时候,解释器可以首先发挥作用,省去了编译的时间,立即执行。解释执行占用更小的内存空间。同时,当编译器进行的激进优化失败的时候,还可以进行逆优化来恢复到解释执行的状态。
编译器(JIT)优点:在程序运行时,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获得更高的执行效率。

你可能感兴趣的:(Java,java)