一 java代码是如何运行的

      java代码运行需要jre也就是java的运行时环境。
      那么为什么java代码就一定要在jvm中运行呢。      
      这是因为java代码是一种高级语言,语法非常复杂,直接在硬件上使用不太现实,抽象程度很高,
需要做一些转换才能变为系统可识别的机器码来执行,这个转换工作就是jvm中做的。首先通过编译器将java代码编译成字节码文件 (也就是虚拟机能识别的指令序列,为什么称之为字节码,因为java字节码指令的操作码(opcode)被固定为一个字节)。然后这些字节码文件被类加载器加载到jvm,然后存储到jvm的方法区中,当需要执行某一方法的时候,就去方法区中执行对应的方法,在运行过程中,每当调用进入一个方法,会在当前线程的方法栈中生成一个栈针,用于存放局部变量和字节码的操作数(栈针是提前计算好的,且在jvm中不要求是连续的内存空间),方法执行完成,会弹出当前的栈针并舍弃。
       操作系统不能识别字节码文件,需要jvm翻译成可识别的机器码来执行相应的命令,jvm有两种翻译方式:
       1.解释执行 每执行一行字节码,jvm将这行字节码翻译成机器码再去执行,无需等待编译,整体执行速度不快
       2.即时编译 将整个方法内的字节码文件翻译成机器码然后再执行,需要等待编译,整体执行速度快,即时编译拥有程序的运行时信息,并且能够根据这个信息做出相应的优化
       hotspot采用混合模式,先采用解释执行字节码,然后将其中反复执行的字节码,以方法为单位,编译成机器码直接运行在机器上
   Hotspot内置多个即时编译器,就是要在编译代码和生成代码的执行效率之间作取舍。
        C1     主要是针对对客户端性能要求较高的程序,采用优化手段简单,因此编译时间较短
        C2     主要是针对对服务端峰值处理性能较高的程序,采用优化手段复杂,因此编译时间长,但是生成代码的执行效率较高
        graal  java10引入 的实验性即时编译器
   java 7 开始,Hotspot采用分层编译的方式,即热点方法先在C1编译,然后热点方法中的热点会进一步被C2编译。
   为了不干扰业务的执行,编译是在额外的线程执行的,hotspot会根据CPU的数量设置编译线程的数量,然后按照1:2的比例分配C1和C2
   说明:在资源充沛的时候,允许解释编译和即时编译同时进行的,即时编译好的机器码会在下一次调用此方法时候启用,替换原本的解释执行。
   
   jvm运行时内存分配:

                           方法区
                           堆
                           PC寄存器
                           方法栈
                           本地方法栈

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值