Java代码如何运行?

限于喜欢 提交于 2020-01-01 09:50:04

C++将代码编译成机器码给机器阅读
编译器将Java程序转换成Java字节码

Java 虚拟机具体是怎样运行 Java 字节码的

  • 一次编写,到处运行
    Java虚拟机可以由硬件实现,也可以在各个现有平台提供软件实现。一旦一个程序被转换成 Java 字节码,那么它便可以在不同平台上的虚拟机实现里运行

调用方法时,Java虚拟机会在当前线程的Java方法栈(包括本地方法栈和虚拟机方法栈)中生成一个栈帧,用于存放局部变量及字节码的操作数。这个栈帧的大小是提前计算好的,而且 Java 虚拟机不要求栈帧在内存空间里连续分布。当退出当前执行的方法时,不管是正常返回还是异常返回,Java 虚拟机均会弹出当前线程的当前栈帧,并将之舍弃。

  • Java虚拟机将字节码翻译成机器码的过程
  1. 解释执行: 逐条将字节码翻译成机器码并执行
  2. 即时编译(,Just-In-Time Compilation,JIT):将一个方法中所有字节码编译成机器码后再执行。
  3. HotSpot 默认采用混合模式,综合了解释执行和即时编译两者的优点。它会先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译

Java 虚拟机的运行效率

  • 即时编译后的 Java 程序的执行效率,是可能超过 C++ 程序的。这是因为与C++静态编译相比,即时编译拥有程序的运行时信息,并且能够根据这个信息做出相应的优化

  • 即时编译器:HotSpot 内置了多个即时编译器:C1、C2 和 Graal。

  1. C1:即Client编译器, 面向的是对启动性能有要求的客户端 GUI 程序,采用的优化手段相对简单,因此编译时间较短
  2. C2:Server 编译器,面向的是对峰值性能有要求的服务器端程序,采用的优化手段相对复杂,因此编译时间较长,但同时生成代码的执行效率较高
  • 从 Java 7 开始,HotSpot 默认采用分层编译的方式:热点方法首先会被 C1 编译,而后热点方法中的热点会进一步被 C2 编译。
  • 为了不干扰应用的正常运行,HotSpot 的即时编译是放在额外的编译线程中进行的。HotSpot 会根据 CPU 的数量设置编译线程的数目,并且按 1:2 的比例配置给 C1 及 C2 编译器。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!