"深入拆解java虚拟机"笔记-Java代码是怎么运行的

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

编译完成后的机器码会在下次调用该方法时启用,以替换原本的解释执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值