Java基礎學習總結(121)——Java JVM執行流程
一、JVM的體系結構
2、驗證匯入類的正確性
3、為類分配初始化記憶體
4、幫助解析符號引用
執行引擎
執行包在裝載類的方法中的指令,也就是方法
執行區資料
虛擬機器會在整個計算機記憶體中開闢一塊記憶體儲存JVM需要用到的物件,變數等,執行區資料有分很多小區,分別為:方法區,虛擬機器棧,本地方法棧,堆,程式計數器。
GC
垃圾回收器,是負責回收記憶體中無用的物件,就是這些物件沒有任何引用了,它就會被視為垃圾,也就會被刪除。
二、類在JVM的執行流程
那麼類在JVM的執行流程是怎麼做的呢?共有三步:載入、連結和初始化。
載入
JVM將java類的二進位制形式載入到記憶體中,並將他快取在記憶體中,以便後面使用,如果沒有找到指定的類就會丟擲異常classNotFound,程式在這裡結束。沒有錯誤就繼續在Java堆中生成一個代表這個類的java.lang.Class物件,作為方法區域資料的訪問入口。
連結
這個階段做三件事:驗證、準備和解析(可選)。
驗證是JVM根據java語言和JVM的語義要求檢查這個二進位制形式。例如,如果篡改經過編譯後的類檔案,那麼這個類檔案可能就不能使用了。
準備是指準備要執行的指定的類,準備階段為變數分配記憶體並設定靜態變數的初始化。在這個階段分配的僅為類的變數(static修飾的變數),而不包括類的例項變數。對非final的變數,JVM會將其設定成“零值”,而不是其賦值語句的值:
public static int num = 8;
那麼在這個階段,num的值為0,而不是8。 final修飾的類變數將會賦值成真實的值。
解析是檢查指定的類是否引用了其他的類/介面,是否能找到和載入其他的類/介面。這些檢查將針對被引用的類/介面遞迴進行,JVM的實施也可以在後面階段執行解析,即正在執行的程式碼真正要使用被引用的類/介面的時候。
初始化
在這最後一步中,JVM用賦值或者預設值將靜態變數初始化,初始化發生在執行main方法之前。在指定的類初始化前,會先初始化它的父類,此外,在初始化父類時,父類的父類也要這樣初始化。這個過程是遞迴進行的。
簡而言之,整個流程是將類存進記憶體中,檢查類的對應呼叫的類和介面是否可正常使用,再對類進行初始化的過程。
Java程式碼編譯是由Java原始碼編譯器來完成,流程圖如下所示:
Java位元組碼的執行是由JVM執行引擎來完成,流程圖如下所示:
四、總結
Java虛擬機器的生命週期 一個執行中的Java虛擬機器有著一個清晰的任務:執行Java程式。
程式開始執行時他才執行,程式結束時他就停止。你在同一臺機器上執行三個程式,就會有三個執行中的Java虛擬機器。
Java虛擬機器總是開始於一個main()方法,這個方法必須是公有、返回void、直接受一個字串陣列。在程式執行時,你必須給Java虛擬機器指明這個包換main()方法的類名。 Main()方法是程式的起點,他被執行的執行緒初始化為程式的初始執行緒。程式中其他的執行緒都由他來啟動。
Java中的執行緒分為兩種:守護執行緒(daemon)和普通執行緒(non-daemon)。守護執行緒是Java虛擬機器自己使用的執行緒,比如負責垃圾收集的執行緒就是一個守護執行緒。當然,你也可 以把自己的程式設定為守護執行緒。包含Main()方法的初始執行緒不是守護執行緒。
只要Java虛擬機器中還有普通的執行緒在執行,Java虛擬機器就不會停止。如果有足夠的許可權,你可以呼叫exit()方法終止程式。
類裝載系統
1、定位和匯入二進位制class檔案2、驗證匯入類的正確性
3、為類分配初始化記憶體
4、幫助解析符號引用
執行引擎
執行包在裝載類的方法中的指令,也就是方法
執行區資料
虛擬機器會在整個計算機記憶體中開闢一塊記憶體儲存JVM需要用到的物件,變數等,執行區資料有分很多小區,分別為:方法區,虛擬機器棧,本地方法棧,堆,程式計數器。
GC
垃圾回收器,是負責回收記憶體中無用的物件,就是這些物件沒有任何引用了,它就會被視為垃圾,也就會被刪除。
二、類在JVM的執行流程
那麼類在JVM的執行流程是怎麼做的呢?共有三步:載入、連結和初始化。
載入
JVM將java類的二進位制形式載入到記憶體中,並將他快取在記憶體中,以便後面使用,如果沒有找到指定的類就會丟擲異常classNotFound,程式在這裡結束。沒有錯誤就繼續在Java堆中生成一個代表這個類的java.lang.Class物件,作為方法區域資料的訪問入口。
連結
這個階段做三件事:驗證、準備和解析(可選)。
驗證是JVM根據java語言和JVM的語義要求檢查這個二進位制形式。例如,如果篡改經過編譯後的類檔案,那麼這個類檔案可能就不能使用了。
準備是指準備要執行的指定的類,準備階段為變數分配記憶體並設定靜態變數的初始化。在這個階段分配的僅為類的變數(static修飾的變數),而不包括類的例項變數。對非final的變數,JVM會將其設定成“零值”,而不是其賦值語句的值:
public static int num = 8;
那麼在這個階段,num的值為0,而不是8。 final修飾的類變數將會賦值成真實的值。
解析是檢查指定的類是否引用了其他的類/介面,是否能找到和載入其他的類/介面。這些檢查將針對被引用的類/介面遞迴進行,JVM的實施也可以在後面階段執行解析,即正在執行的程式碼真正要使用被引用的類/介面的時候。
初始化
在這最後一步中,JVM用賦值或者預設值將靜態變數初始化,初始化發生在執行main方法之前。在指定的類初始化前,會先初始化它的父類,此外,在初始化父類時,父類的父類也要這樣初始化。這個過程是遞迴進行的。
簡而言之,整個流程是將類存進記憶體中,檢查類的對應呼叫的類和介面是否可正常使用,再對類進行初始化的過程。
類在JVM執行流程
三、Java程式碼編譯和執行的整個過程Java程式碼編譯是由Java原始碼編譯器來完成,流程圖如下所示:
Java位元組碼的執行是由JVM執行引擎來完成,流程圖如下所示:
四、總結
Java虛擬機器的生命週期 一個執行中的Java虛擬機器有著一個清晰的任務:執行Java程式。
程式開始執行時他才執行,程式結束時他就停止。你在同一臺機器上執行三個程式,就會有三個執行中的Java虛擬機器。
Java虛擬機器總是開始於一個main()方法,這個方法必須是公有、返回void、直接受一個字串陣列。在程式執行時,你必須給Java虛擬機器指明這個包換main()方法的類名。 Main()方法是程式的起點,他被執行的執行緒初始化為程式的初始執行緒。程式中其他的執行緒都由他來啟動。
Java中的執行緒分為兩種:守護執行緒(daemon)和普通執行緒(non-daemon)。守護執行緒是Java虛擬機器自己使用的執行緒,比如負責垃圾收集的執行緒就是一個守護執行緒。當然,你也可 以把自己的程式設定為守護執行緒。包含Main()方法的初始執行緒不是守護執行緒。
只要Java虛擬機器中還有普通的執行緒在執行,Java虛擬機器就不會停止。如果有足夠的許可權,你可以呼叫exit()方法終止程式。
相關文章
- 最全java多執行緒學習總結1--執行緒基礎Java執行緒
- 【java學習】控制執行流程Java
- JAVA基礎學習-數字與字串學習總結Java字串
- Java 基礎學習總結(一)抽象類和介面Java抽象
- Java執行緒總結Java執行緒
- Java 執行緒基礎Java執行緒
- JAVA學習--JAVA基礎(一)Java
- 零基礎學習Java,全方位知識點總結!Java
- 9Java基礎總結Java
- java集合框架基礎總結Java框架
- Java基礎知識總結Java
- 【Java 反射學習】Java 反射基礎Java反射
- [Java 反射學習] Java 反射基礎Java反射
- 流程控制與陣列—Java基礎學習(二)陣列Java
- java - 多執行緒基礎Java執行緒
- 【多執行緒總結(一)-基礎總結】執行緒
- Java集合學習總結Java
- android基礎學習-java篇day9-step3-第五節:java執行緒AndroidJava執行緒
- JVM學習總結JVM
- java 執行緒學習Java執行緒
- 【java學習】java知識點總結Java
- Java面試題總結之Java基礎(三)Java面試題
- Java基礎知識總結-1Java
- Java基礎集合簡單總結Java
- Java 常用類總結(SE基礎)Java
- Java基礎知識點總結Java
- Java基礎:Java虛擬機器(JVM)Java虛擬機JVM
- Java執行緒池一:執行緒基礎Java執行緒
- Java 多執行緒 - 總結概述Java執行緒
- 零基礎學Java(6)控制流程Java
- [Java基礎]虛擬執行緒Java執行緒
- Java多執行緒-基礎篇Java執行緒
- Java 基礎(十四)執行緒——下Java執行緒
- Java基礎之執行緒安全Java執行緒
- Java 多執行緒基礎 - CyclicBarrierJava執行緒
- 機械轉行java自學經歷,零基礎學java,血淚總結的乾貨Java
- Android的Java多執行緒部簡介和Synchronized學習總結AndroidJava執行緒synchronized
- 轉行Java能學會嗎?零基礎學習Java的學習路線Java
- 框架執行流程總結框架