您好,登錄后才能下訂單哦!
作為一名Java程序員,我們需要知道Java代碼是怎么運行的。最近復習了深入理解Java虛擬機這本書,做了一下筆記,希望對大家有幫助,如果有不正確的地方,歡迎提出,感激不盡。
在這里小編建了一個前端學習交流扣扣群:132667127,我自己整理的最新的前端資料和高級開發教程,如果有想需要的,可以加群一起學習交流
java 代碼運行主要流程
本文主要講解流程如下:
編譯
我們都知道,java代碼是運行在Java虛擬機上的。但是java是一門面向對象的高級語言,它不僅語法非常復雜,抽象程度也非常高,并不能直接運行在計算機硬件機器上。
Java虛擬機(Java Virtual Machine 簡稱JVM)是運行所有Java程序的抽象計算機,是Java語言的運行環境。
因此,在運行Java程序之前,需要編譯器把代碼編譯成java虛擬機所能識別的指令程序,這就是Java字節碼,即class文件。
所以,Java代碼運行的第一步是:把Java源代碼編譯成.class 字節碼文件。
類加載
在Class文件中描述的各種信息,需要被加載到虛擬機之后才能運行和使用。因此,需要把class字節碼文件加載到Java虛擬機來。
虛擬機把描述類的數據從 Class 文件加載到內存,并對數據進行校驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的 Java 類型,這就是虛擬機的 類加載機制。
加載
在 加載階段,虛擬機需要完成以下3件事情:
加載階段完成后,這些二進制字節流按照虛擬機所需的格式存儲在 方法區之中。
驗證
為了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,不會危害虛擬機的安全,Java虛擬機對輸入的字節流走 驗證過程。
驗證階段包括四個階段:文件格式驗證、元數據驗證、字節碼驗證、符號引用驗證。
準備
準備階段是正式為類變量分配內存并設置類變量初始值,這些變量所使用的內存都將在方法區中進行分配。如:
public static int value =123;
變量value在準備階段過后的初始值是0而不是123。
解析
解析階段是虛擬機將常量池內的符號引用替換為直接引用的過程。
比如:com.User類引用com.Tool類,在編譯時,User類不知道Tool類的實際內存地址,因此只能使用符號com.Tool(假設)來表示。而在類加載加載User類的時候,可以通過虛擬機獲取Tool類的實際內存地址,因此便可以將符號com.Tool替換為Tool類的實際內存地址,即直接引用地址。
解析動作主要針對類或接口、字段、類方法、接口方法、方法類型、方法句柄和調用點限定符 7 類符號引用進行。
初始化
到了初始化階段,才真正開始執行類中定義的Java字節碼。在這個階段,則根據程序員通過程序制定的主觀計劃去初始化類變量和其他資源。
創建對象
Java虛擬機是如何執行字節碼的呢?我們先來看一下運行時創建對象。
Java是面向對象的編程語言,程序的運行是以對象為調用單位的。
方法調用
JVM的調用單位是對象,但是真正執行功能性的代碼還是對象上的方法。
在運行過程中,每當調用進入一個java方法,java虛擬機會在當前線程的java方法棧中生成一個棧幀,用以存放局部變量以及字節碼的操作數。方法棧內存是線程私有的,每個線程都有自己的方法棧。如果對應的方法是本地方法,則對應的就是本地方法棧。
java運行時數據區域如下:
解釋
當調用Java對象的某個方法時,JVM執行引擎會將該方法的字節碼文件翻譯成計算機所能識別的機器碼,機器碼信息保存在方法區中。翻譯有解釋執行和即時編譯兩種方式。
兩種翻譯方式的區別如下:
解釋執行來一行代碼,解釋一行,大部分不常用的代碼,都是采用這種方式。
即使編譯
對于部分熱點代碼,將一個方法包含的所有字節碼翻譯成機器指令,以提高java虛擬機的運行效率。
即時編譯是建立經典的 二八定律上,即20%代碼占據了80%的計算資源。
執行指令
多線程上下文切換
CPU一通上電,就會周而復始從內存中獲取指令、譯碼、執行。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。