Java|Java代码运行的过程是怎样的?

Java|Java代码运行的过程是怎样的?

文章图片

Java|Java代码运行的过程是怎样的?

文章图片

Java|Java代码运行的过程是怎样的?

文章图片

Java|Java代码运行的过程是怎样的?

文章图片

Java|Java代码运行的过程是怎样的?

文章图片

Java|Java代码运行的过程是怎样的?

文章图片

Java|Java代码运行的过程是怎样的?

文章图片

Java|Java代码运行的过程是怎样的?

【Java|Java代码运行的过程是怎样的?】这期我们来聊一聊java代码是如何运行的 。 大家都知道java是运行在JVM上的 , 那它是怎么结合操作系统去控制那些硬件设备的呢?
其实想要知道这个问题我们可以跟踪一行代码的整个生命周期来解释 , 我把它抽象为这么五个步骤 。

首先这行代码会被编译成字节码 , 然后被JVM通过类加载器进行加载 , 接着再被解释器解释成机器码 , 然后分配执行这段指令需要的资源---主要是内存 。 然后就是CPU执行指令把结果写回内存了 。
接下来我们一个步骤一个步骤地来具体分析 。
首先java是一门高级语言 , 这类语言并不能直接运行在硬件上 , 它必须运行在能够识别java语言特性的虚拟机上 , 而java代码必须通过java编译器将其转换为虚拟机能识别的指令序列 , 也称为java字节码 。

那么System.out.println(\"Hello world\")编译后的字节码是怎样的呢?最左列是偏移量 , 中间列是给虚拟机读的字节码 , 最右列是高级语言的翻译 。
有了字节码 , java虚拟机通过类加载器进行加载 , 加载完之后 , 我们通过解释器解释成汇编指令 , 最终再转译成CPU可以识别的机器指令 , 那么通过汇编语言转换成的机器指令具体是怎样的呢?

我们可以看到中间是机器码 , 第三列为对应的机器指令 , 最后一列为对应的汇编代码 。

解释器是通过软件来实现的 , 它将字节码转换成汇编指令 , 可以实现同一份java字节码在不同的硬件设备上运行 , 而将汇编指令转换成机器指令由硬件直接实现 , 所以它的速度会更快 。

JVM为了提高运行效率会将某些热点代码一次全部编译成机器指令再执行 , 也就是和解释执行对应的即使编译 , 即使编译的机器码存放在一个叫codecache的缓存的地方 , 这块内存属于堆外内存 。 如果这块内存不够了 , 那么即使编译器将不会再进行编译 , 可能导致程序运行变慢 , 这也是我们排查性能问题变慢的一个点 。
代码转换成了指令 , 指令要执行就必须要有上下文的环境 , 这些环境包括指令寄存器、数据寄存器、栈空间等内存资源 。

程序加载进内存后指令就在内存中了 , 指令的指针寄存器IP指向内存中的下一条待执行指令的地址 , CPU的控制单元根据IP寄存器的指向将主存中的指令装载到指令寄存器 , 这个指令寄存器也是一个存储设备 , 不过它集成在CPU内部 , 指令从主存到达CPU后只是一串010101的二进制串 , 还需要通过译码器进行解码 。 解码后根据运算类型再从主存中获取操作数 , 并调用运算单元进行计算 。