.class文件转换.java_jvm:java代码是如何运行的

e5c7016bb70a7575df1b2ce4a2484762.png

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

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

怎样运行 Java 字节码的?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值