JVM

Write Once, Run Everywhere!

Java运行在JVM中,不直接与底层平台交互,牺牲了平台级的代码优化,获取了高度的可移植性。

类加载器


运行时数据区


执行引擎


  • 解释执行:逐条解释字节码指令,翻译成机器码执行
  • 即时编译(JIT):运行过程中根据运行时信息将整段机器码指令进行优化,存到code cache中备用

即时编译属于动态编译,存在额外开销,如果代码执行频率低,解释执行即可
如果代码执行频率高,才值得编译一次,直接运行cache中优化过的代码,提升执行效率

客户端和服务端有不同的优化策略,根据场景配备不同的即时编译器
客户端模式注重快速启动,优化比较轻量,资源消耗少
服务端模式注重长期性能,优化更高级,资源消耗大
Java7时期引用层次编译,融合二者特点,初期用客户端模式,响应更快,后期用服务端,更好的优化
部署时要考虑到冷机状态和热机状态下的性能差异

常见的优化有死代码剔除,方法内联,循环优化等

解释和编译行为可控,-Xint只进行解释执行,-Comp只进行编译执行