虚拟机可以写java代码吗_我们写的java代码是如何运行起来的

我们一步一步的分析

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

944e510529ce0f5f15c6fb2d91df550c.png

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

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

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

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

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

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

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

解释执行:即逐条将字节码翻译成机器码并执行。

即时编译(Just-In-Time compilation,JIT):即将一个方法中包含的所有字节码编译成机器码后再执行。

7eb955f678fe520ffe6e1a2cfc93d8e3.png解释执行的好处是无须等待编译,即时编译的好处是实际执行速度更快。 HotSpot 默认采用混合模式,综合了解释执行和即时编译两者的优点,它会先解释执行字节码,然后将其中反复执行的热点代码,以方法为单位进行即时编译。 好了目前已经解释了我们java代码是如何运行起来的,以及他们运行的原理,希望大家喜欢!

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


版权声明:本文为weixin_29554335原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。