您的位置 首页 java

jvm:java代码是如何运行的

java需要依赖 JRE 的运行环境,而C++ 代码则无需额外的运行时,往往把代码直接编译成 CPU 所能理解的机器码即可,java为什么不这样做,为什么java要在 虚拟机 中运行呢?

  • 可移植性,实现跨平台,一次编写到处运行。
  • 托管环境,比如自动内存管理与垃圾回收,同时还提供诸如数组越界、动态类型、安全权限等的动态检测,让我们可以专心的写业务代码。
  • 降低复杂度,先将 Java 代码转换成 Java 字节码,最后才转换成机器码。

怎样运行 Java 字节码的?

  • 首先将 Java 代码编译成的 class 文件
  • 将 class 文件加载到 Java 虚拟机中(载入Java内存),加载后的 Java 类会被存放于方法区(Method Area)中
  • 运行时,虚拟机执行方法区内的代码

我们都知道 Java 源文件 ,通过编译器,能够生产相应的.Class 文件,也就是 字节码 文件,而字节码文件又通过 Java 虚拟机中的解释器,编译成特定机器上的机器码 。

  • Java 源文件—->编译器—->字节码文件
  • 字节码文件—-> JVM —->机器码

每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是 Java 为什么能够跨平台的原因了 ,当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。

Java 虚拟机会将栈细分为面向 Java 方法的虚拟机栈,面向本地方法(用 C++ 写的 native 方法)的本地方法栈,以及存放各个 线程 执行位置的程序计数器。

执行java代码首先需要将它编译而成的class文件加载到java虚拟机中,在运行过程中,每当调用进入一个 Java 方法,Java 虚拟机会在当前线程的虚拟机栈中生成

一个栈帧,用以存放局部变量以及字节码的操作数。(栈帧是提前计算好且不需连续分布)当退出当前执行的方法时,不管是正常返回还是异常返回,Java 虚拟机均会弹出当前线程的当前栈帧,并将之销毁。

虚拟机将字节码翻译成机器码有两种形式:

  • 解释执行:即逐条将字节码翻译成机器码并执行;
  • 即时编译(Just-In-Time compilation, JIT ),即将一个方法中包含的所有字节码编译成机器码后再执行。

解释执行的好处是无须等待编译,即时编译的好处是实际执行速度更快。

HotSpot 默认采用混合模式,综合了解释执行和即时编译两者的优点,它会先解释执行字节码,然后将其中反复执行的热点代码,以方法为单位进行即时编译。

文章来源:智云一二三科技

文章标题:jvm:java代码是如何运行的

文章地址:https://www.zhihuclub.com/181534.shtml

关于作者: 智云科技

热门文章

网站地图