java虚拟机学习-01 | Java代码是怎么运行的?

https://time.geekbang.org/column/article/11289

Java为什么要在虚拟机中运行

  1. java语言复杂,抽象程度高,不能够直接转成字节码,需要进行一定的转换;目前主流方式是利用Java虚拟机将代码转为Java字节码,然后转成字节码. C++的策略是直接编译成对应机器的字节码运行
  2. java虚拟机在不同的平台中运行,达到java代码"一处编译,处处运行".
  3. java虚拟机带来一个托管环境,托管环境能够代替我们处理一些冗长而且容易出错的地方,例如垃圾回收,自动内存管理;还有数组越界,动态类型,安全权限等动态检测

Java虚拟机具体怎么运行代码

虚拟机角度

  1. 虚拟机将编译成的class文件加载进虚拟机中,存在方法区(Method Area)中,实际运行时执行方法区中的方法
  2. java虚拟机将运行时内存分为方法区,堆,PC寄存器(记录各个线程的执行位置),java方法栈,本地方法栈,后三个统称为栈区
  3. 在运行过程中,调用进入java方法时,虚拟机会在当前线程中的java方法栈中生成一个栈桢,用来存放局部变量和字节码的操作数,当方法结束时,虚拟机会弹出当前栈桢并舍弃,不论正常或者异常返回
  4. 调用方法时,虚拟机生成的栈桢时提前计算好的,并且虚拟机不要求栈桢在内存空间内连续
java虚拟机

 

硬件角度

        从硬件角度看,java字节码不能够直接运行在服务器上,因此需要虚拟机对字节码进行解释.

        HotSpot虚拟机有两种解释方式:

  • 解释执行:执行时才将java字节码逐句翻译成机器码执行,这种方式无需等待编译且不占内存
  • 即时编译(Just-In-Time compilation,JIT):将一个方法内的所有字节码都编译成机器码后再执行,这种方式在实际运行时速度更快.

       HotSpot将两种解释方式混合使用,它会先解释执行字节码,然后将热点代码以方法为单位进行即时编译.

      热点代码:在git里面涉及到的热点代码有两种算法,基于采样的热点探测和基于计数器的热点探测。一般采用的都是基于计数器的热点探测。

 

java虚拟机的运行效率究竟怎么样

HotSpot有多个即时编译器:c1,c2,graal

  • c1:又叫作client编译器,面向有启动需求的GUI程序,优化手段较为简单,编译时间较短
  • c2:又叫作server编译器,面向对峰值性能有有要求的服务端程序,优化手段复杂,编译时间较长,但生成代码执行效率高

        从 Java 7 开始,HotSpot 默认采用分层编译的方式:热点方法首先会被 C1 编译,而后热点方法中的热点会进一步被 C2 编译。

        为了不干扰应用的正常运行,HotSpot 的即时编译是放在额外的编译线程中进行的。HotSpot 会根据 CPU 的数量设置编译线程的数目,并且按 1:2 的比例配置给 C1 及 C2 编译器。

        在计算资源充足的情况下,字节码的解释执行和即时编译可同时进行。编译完成后的机器码会在下次调用该方法时启用,以替换原本的解释执行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值