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代碼是如何運行起來的,以及他們運行的原理,希望大家喜歡!

本文中版權歸獨秀天狼團隊所有,轉載請標註清楚。

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