? ?JVM是虚拟机的规范,HotSpot是jvm的具体实现
? ?HotSpot包括一个解释器和两个编译器(client 和 server,二选一的),解释与编译混合执行模式,默认启动解释执行。
?? ?编译器:java源代码被编译器编译成class文件(字节码),java字节码在运行时可以被动态编译(JIT)成本地代码(前提是解释与编译混合执行模式且虚拟机不是刚启动时)。
????解释器:?解释器用来解释class文件(字节码),java是解释语言(书上这么说的)。
??? server启动慢,占用内存多,执行效率高,适用于服务器端应用;
??? client启动快,占用内存小,执行效率没有server快,默认情况下不进行动态编译,适用于桌面应用程序。
??????动态编译(compile during run-time),英文称Dynamic compilation;Just In Time也是这个意思。
??????HotSpot对bytecode的编译不是在程序运行前编译的,而是在程序运行过程中编译的。
??????HotSpot里运行着一个监视器(Profile Monitor),用来监视程序的运行状况。
????? java字节码(class文件)是以解释的方式被加载到虚拟机中(默认启动时解释执行)。?程序运行过程中,那一部分运用频率大,那些对程序的性能影响重要。对程序运行效率影响大的代码,称为热点(hotspot),HotSpot会把这些热点动态地编译成机器码(native code),同时对机器码进行优化,从而提高运行效率。对那些较少运行的代码,HotSpot就不会把他们编译。
??????HotSpot对字节码有三层处理:不编译(字节码加载到虚拟机中时的状态。也就是当虚拟机执行的时候再编译),编译(把字节码编译成本地代码。虚拟机执行的时候已经编译好了,不要再编译了),编译并优化(不但把字节码编译成本地代码,而且还进行了优化)。
?????? 至于那些程序那些不编译,那些编译,那些优化,则是由监视器(Profile Monitor)决定。
????为什么字节码在装载到虚拟机之前就编译成本地代码那??
????动态编译器也在许多方面比静态编译器优越。静态编译器通常很难准确预知程序运行过程中究竟什么部分最需要优化。
?? ?函数调用都是很浪费系统时间的,因为有许多进栈出栈操作。因此有一种优化办法,就是把原来的函数调用,通过编译器的编译,改成非函数调用,把函数代码直接嵌到调用出,变成顺序执行。
????面向对象的语言支持多态,静态编译无效确定程序调用哪个方法,因为多态是在程序运行中确定调用哪个方法。
? ?Java ?HotSpot ?Client ?VM:为在客户端环境中减少启动时间而优化;比较适合桌面程序,它会做一些例如像快速初始化,懒加载这一类的事件来适应桌面程序的特点。
? ? Java ?HotSpot ?Server ?VM:为在服务器环境中最大化程序执行速度而设计; 适合做服务器程序,一些针对服务器特点的事情,比如预加载,尤其在一些并发的处理上,是会做更多的优化。