日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

这大概是一篇最简单最清晰的Java JVM执行流程

發布時間:2025/3/21 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 这大概是一篇最简单最清晰的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执行流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。