jvm:java代码是如何运行的

jvm:java代码是如何运行的java需要依赖JRE的运行环境,而C++代码则无需额外的运行时,往往把代码直接编译成CPU所能理解的机器码即可。

jvm:java代码是如何运行的

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

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

怎样运行 Java 字节码的?

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

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

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

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

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

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

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

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

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

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

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

今天的文章jvm:java代码是如何运行的分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/7844.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注