[JVM]解释器和JIT(just in time complier)即时编译器

JVM执行class字节码的过程

当JVM加载.class文件中的字节码到jvm后是如何进行执行的呢

那就是解释器和即时编译器的工作了

[JVM]解释器和JIT(just in time complier)即时编译器_第1张图片

javac的字节码最终是要以本地机器码的形式来执行的

有解释器和即时编译器两种方式来对字节码来处理

解释器根据.class文件的字节码逐条执行(一次一次转换为单条机器码?)基于栈的架构,而不是传统的寄存器架构

为了实现平台无关性(不同操作系统的寄存器架构不同),和便于传输(每条指令对齐),但是牺牲了一部分执行效率(频繁的对栈操作)

而即时编译器将字节码再次编译为本地机器码,存于内存之中,用内存空间换取执行效率

所以即时编译又称为后端编译器,javac称为前端编译器

 

java与C++在运行和编译上的区别

  • 从编译的角度来讲,C++是典型的静态编译器,在编译阶段直接产生机器码,而java为即时编译器,一部分编译的工作(动态分派,边运行边类加载)等交给了JVM来完成。所以即时编译器占用了一部分用户程序运行的时间
  • java在执行时为了确保安全性,因此要频繁进行动态类型的检查
  • java的垃圾回收机制,降低了执行效率换取了开发效率
  • java不能在栈上分配对象(栈上只存引用不存对象)

 

你可能感兴趣的:(JVM)