JVM独家学习(3) java代码是如何运行起来的

我们一步一步的分析

首先我们写好了一份java工程代码,那工程里面代码中,是不是有很多的".java"的后缀文件?
比如:CHUser.java, HookDevice.java, MqttMointer.java等等…
这些代码我们在各种开发工作中都是非常常见的。
那么大家我们这些写好的java代码之后,接下来你部署在本地的windows系统或者部署在线上的linux系统,你是如何做的?
如果是spring boot工程的那就是一个jar包就可以,或者传统的工程后缀是war包。
在这里插入图片描述

我们来回忆一下上面这个图的顺序

但实际上这个图里面有一个比较关键的步骤那就是 compile (编译过程)也就是我们写好的 .java代码在打包的过程中,就会编译成.class的字节码文件如上图的CHUser.class,HookDevice.class,MqttMointer.class。
然后就可以在jvm中运行起来了。

Java 虚拟机具体是怎样运行 Java 字节码的?

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

在这里插入图片描述
Java 虚拟机会将栈细分为面向 Java 方法的 Java 方法栈,面向本地方法(用 C++ 写的)的本地方法栈,以及存放各个线程执行位置的PC 寄存器

本地方法,用关键字 native 修饰,基于JNI(Java Native Interface,Java本地接口),它允许 Java代码和其他语言写的代码进行交互。

在运行过程中,每当调用进入一个 Java 方法,Java 虚拟机会在当前线程的 Java 方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。
当退出当前执行的方法时,不管是正常返回还是异常返回,Java 虚拟机均会弹出当前线程的当前栈帧,并将之舍弃。Java 虚拟机将字节码翻译成机器码有两种形式:

  1. 解释执行:即逐条将字节码翻译成机器码并执行。
  2. 即时编译(Just-In-Time compilation,JIT):即将一个方法中包含的所有字节码编译成机器码后再执行。
    在这里插入图片描述
    解释执行的好处是无须等待编译,即时编译的好处是实际执行速度更快。
    HotSpot 默认采用混合模式,综合了解释执行和即时编译两者的优点,它会先解释执行字节码,然后将其中反复执行的热点代码,以方法为单位进行即时编译。
    好了目前已经解释了我们java代码是如何运行起来的,以及他们运行的原理,希望大家喜欢!

本文中版权归独秀天狼团队所有,转载请标注清楚。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章