java是一个半解释半编译型语言,早期java是通过解释器来执行,效率低下;后期进行优化,解释器在原本的c++字节码解释器基础上,扩充了模板解释器,效率有了明显提升;后来又加入了JIT(即时编译),效率就更加得到了提升。
解释器与编译器
解释器与编译器两者各有优势:当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率。当程序发现运行环境中内存资源限制较大,可以使用解释执行节约内存,反之可以使用编译执行来提升效率。同时,解释器还可以作为编译器激进优化时的一个“逃生门”,让编译器根据概率选择一些大多数时候都能提升运行速度的优化手段,当激进优化的假设不成立,如加载了新类后类型继承结构出现变化、出现“罕见陷阱”(Uncommon Trap)时可以通过逆优化(Deoptimization)退回到解释状态继续执行(部分没有解释器的虚拟机中也会采用不进行激进优化的C1编译器担当“逃生门”的角色),因此,在整个虚拟机执行架构中,解释器与编译器经常配合工作如下图所示:
img
利用参数来指定虚拟机处于"解释模式"、"编译模式"还是"混合模式"。
混合模式:
java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
解释模式:
java -Xint -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, interpreted mode)
编译模式:
java -Xcomp -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, compiled mode)
解释器
字节码解释器
.java->javac->c++代码->硬编码(机器码)
模板解释器