java和c++的区别
c++直接编译成机器码可直接运行在机器上
java需要先编译成class文件,需要提供jre环境,在虚拟机上才能运行
java为什么要跑在虚拟机上
在虚拟机上运行可以屏蔽对底层的兼容,一处编译多处运行。虚拟机也提供了内存的管理功能GC,和安全的检测功能
java虚拟机怎样运行字节码
虚拟机内部分为
线程共享的方法区,堆
线程不共享的栈,本地方法栈,程序计数器
从虚拟机来看
虚拟机将class文件加载到方法区,在java运行过程当中执行方法,就会从方法区中取,虚拟机会为当前线程的栈中生成栈帧,栈帧负责存储局部变量和字节码操作数,退出当前方法栈帧就会退出
从硬件来看
机器不能直接执行class文件,需要虚拟机将class文件翻译成机器码才能执行
1,解释执行
逐条将字节码翻译成机器码并执行,无需等待
2,JIT即时编译
将一个方法所有的字节码都编译成机器码执行,执行速度快
java虚拟机的运行效率
虚拟机采用的是混合模式,综合了解释执行和即时编译的有点,因为即时编译复合二八定律,即百分之二十的代码占据了百分之八十的运算律,所以对于大部分不常用的代码我们使用解释执行,小部分常用代码使用即时编译提高执行效率
有些使用即时编译甚至好过c++的静态编译,因为可以根据运行信息去进行执行的优化