这大概是一篇最简单最清晰的Java JVM执行流程
一、JVM的體系結構
類裝載系統
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 JVM执行流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这么说吧,Netty很简单,其实就是个J
- 下一篇: 十五道java开发常遇到的计算机网络协议