JVM|Java代码如何运行?

3 篇文章 0 订阅

参考极客时间专栏《深入拆解Java虚拟机》

Java代码(.java)通过编译器转换为虚拟机能识别的Java字节码(.class,指令序列)。Java字节码指令的操作码固定为“一个字节”,所以指令序列命名为Java字节码。
Java虚拟机可以通过软件和硬件实现。使用软件实现的目的是“一次编码,处处运行”。

以JDK标准的的HopSpot虚拟机为例,JVM是如何运行Java字节码的?

  • 软件视角:
    Java代码编译成字节码,将字节码加载到JVM中。加载后Java类存放于方法区(Method Area)中。运行时,JVM执行方法区中代码。类似于X86的段式内存管理中的代码段。JVM同样在内存中划分堆、栈存储运行时数据。不同的是, JVM将栈分为面向Java方法的Java方法栈 、面向本地方法(C++写的native方法)的本地方法栈 和存放各线程执行位置的PC寄存器
    JVM
    运行过程中,每当调用一个进入Java的方法,JVM会在当前线程的Java方法栈中生成一个栈帧,用于存放局部变量、字节码的操作数。栈帧大小是提前算好的,且JVM不要求栈帧在内存里连续分布。
    退出Java方法时,不论正常返回还是异常返回,JVM都会当前线程的当前栈帧并抛弃。
  • 硬件视角:
    Java 字节码无法直接执行,因此,JVM将字节码翻译成机器码。
    在HotSpot里,翻译有两种方法:一是解释执行,即逐条将字节码翻译成机器码并执行;二是即时翻译(Just-In-Time compilation,JIT),即将一个方法中包含所有字节码翻译成机器码后再执行。
    字节码翻译字节码的两种方法
    解释执行优势在于不用等待编译,即时翻译优势在于运行时更快。HotShot默认使用混合编译模式。先解释执行代码,再将热点代码以方法为单位即时翻译。

总结

JVM执行图

ps:虚心求教。如果内容有误欢迎指出,如果内容帮助了你欢迎留下痕迹。

END

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值