JVM执行class字节码的过程
当JVM加载.class文件中的字节码到jvm后是如何进行执行的呢
那就是解释器和即时编译器的工作了
javac的字节码最终是要以本地机器码的形式来执行的
有解释器和即时编译器两种方式来对字节码来处理
解释器根据.class文件的字节码逐条执行(一次一次转换为单条机器码?)基于栈的架构,而不是传统的寄存器架构
为了实现平台无关性(不同操作系统的寄存器架构不同),和便于传输(每条指令对齐),但是牺牲了一部分执行效率(频繁的对栈操作)
而即时编译器将字节码再次编译为本地机器码,存于内存之中,用内存空间换取执行效率
所以即时编译又称为后端编译器,javac称为前端编译器
java与C++在运行和编译上的区别
- 从编译的角度来讲,C++是典型的静态编译器,在编译阶段直接产生机器码,而java为即时编译器,一部分编译的工作(动态分派,边运行边类加载)等交给了JVM来完成。所以即时编译器占用了一部分用户程序运行的时间
- java在执行时为了确保安全性,因此要频繁进行动态类型的检查
- java的垃圾回收机制,降低了执行效率换取了开发效率
- java不能在栈上分配对象(栈上只存引用不存对象)