JVM|Java代码如何运行?

参考极客时间专栏《深入拆解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

猜你喜欢

转载自blog.csdn.net/qq_32328959/article/details/88529763