为什么java要在虚拟机里运行?
- 语法非常复杂,抽象程度很高。直接在硬件运行不现实,因此需要转换
- 通过编译器将Java程序转换成虚拟机所能识别的指令序列-Java字节码。
- 虚拟机执行时,转换成机器识别码
虚拟机的好处
- 在不同系统平台上提供软件形式的虚拟机,一旦程序被编译成字节码,则就能实现“一次编写,到处运行”
- 带来了一个托管环境,提供了各种处理
- 自动内存管理和垃圾回收
- 数组越界、动态类型、安全权限等
Java虚拟机具体运行Java字节码过程
- Java代码编译成字节码class,加载进虚拟机中。类被放进方法区中
- 实际调用时,虚拟机在当前线程的Java方法栈中生成栈帧,存放局部变量及字节码的操作数。栈帧分布不一定连续
- 方法执行完毕,虚拟机弹出当前线程的当前栈帧将之舍弃
Java字节码翻译成机器码
- 解释执行
- 逐条将字节码翻译成机器码执行
- 无需等待编译
- 即时执行(JIT)
- 将一个方法中包含的所有字节码翻译成字节码后再执行
- 实际运行速度快
HotSpot内置即时编译器
- C1:client编译器,优化手段简单,编译时间短
- C2:server编译器,优化手段复杂,编译时间较长,生成代码的执行效率较高
- 编译策略
- 分层编译:热点方法首先被C1编译,而后热点方法中的热点进一步被C2编译
- 即时编译放在额外的编译线程中进行,根据cpu数量设置编译线程数量,按照1:2比例分配给C1和C2
编译完成后的机器码会在下次调用该方法时启用,以替换原本的解释执行