亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Java虛擬機及JVM體系結構是什么

發布時間:2021-10-23 17:04:20 來源:億速云 閱讀:134 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關如何理解Java虛擬機及JVM體系結構是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

JVM(Java 虛擬機)

Java虛擬機,java源文件(.java)通過編譯器生成字節碼文件(.class),字節碼文件(.class)通過JVM(Java虛擬機)中的解釋器再翻譯成特定機器上的機器碼。

編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然后由解釋器來將虛擬機代碼轉換為特定系統的機器碼執行。

每一種平臺的解釋器是不同的,但是實現的虛擬機是相同的。

Java源程序經過編譯器編譯后變成字節碼,字節碼由虛擬機解釋執行,虛擬機將每一條要執行的字節碼送給解釋器,解釋器將其翻譯成特定機器上的機器碼,然后在特定的機器上運行。

如何理解Java虛擬機及JVM體系結構是什么

如何理解Java虛擬機及JVM體系結構是什么

JVM體系結構

JVM都有兩種機制,一個是裝載具有合適名稱的類(類或是接口),叫做類裝載子系統;另外的一個負責執行包含在已裝載的類或接口中的指令,叫做運行引擎。每個JVM又包括方法區、堆、Java棧、程序計數器和本地方法棧這五個部分,這幾個部分和類裝載機制與運行引擎機制一起組成的體系結構圖為:

JVM的每個實例都有一個它自己的方法域和一個堆,運行于JVM內的所有的線程都共享這些區域;當虛擬機裝載類文件的時候,它解析其中的二進制數據所包含的類信息,并把它們放到方法域中;當程序運行的時候,JVM把程序初始化的所有對象置于堆上;而每個線程創建的時候,都會擁有自己的程序計數器和Java棧,其中程序計數器中的值指向下一條即將被執行的指令,線程的Java棧則存儲為該線程調用Java方法的狀態;本地方法調用的狀態被存儲在本地方法棧,該方法棧依賴于具體的實現。

(1)類裝載子系統

裝載  連接  初始化

(2)方法區。被所有線程共享。垃圾收集也會清理方法區中的無用類型對象。

a. 類型信息。類加載器加載類時,從類文件中提取出來。

類的完整有效名

父類的完整有效名(interface and java.lang.Object 除外,因為無父類)

類型的修飾符

類型直接接口列表

b. 常量池。存儲了一個類型所使用的常量所有類型、域和方法的符號引用。

c. 域信息。jvm必須在方法區中保存類型的所有域的相關信息以及域的聲明順序,                      域的相關信息包括:               域名               域類型               域修飾符(public private protected static final volatile transient…)

d.方法信息。

方法名

方法返回類型

方法參數

方法的修飾符

方法的字節碼(abstract and native 除外)(被PC寄存器指向)

操作數棧和方法棧幀的局部變量區的大小

異常表

e. 類的靜態變量(所有對象共享一分拷貝)

f. 類的被聲明為final的類變量(所有對象共享一分拷貝)

g. 加載一個類的類加載器的引用

h. Class類的引用

i. 方法表。

j. 一個例子:

Class Lava { private int speed = 5; void flow(); } Class Volcano { public static void main(String[] args) { Lava lava = new Lava(); lava.flow(); } }

下面我們描述一下main()方法的***條指令的字節碼是如何被執行 的。不同的jvm實現的差別很大,這里只是其中之一。

為了運行這個程序,你以某種方式把“Volcano"傳給了jvm。有了 這個名字,jvm找到了這個類文件(Volcano.class)并讀入,它從 類文件提取了類型信息并放在了方法區中,通過解析存在方法區中的 字節碼,jvm激活了main()方法,在執行時,jvm保持了一個指向當前 類(Volcano)常量池的指針。

注意jvm在還沒有加載Lava類的時候就已經開始執行了。正像大多數的 jvm一樣,不會等所有類都加載了以后才開始執行,它只會在需要的時候 才加載。

main()的***條指令告知jvm為列在常量池***項的類分配足夠的內存。 jvm使用指向Volcano常量池的指針找到***項,發現是一個對Lava類 的符號引用,然后它就檢查方法區看lava是否已經被加載了。

這個符號引用僅僅是類lava的完整有效名”lava“。這里我們看到為了jvm 能盡快從一個名稱找到一個類,一個良好的數據結構是多么重要。這里jvm 的實現者可以采用各種方法,如hash表,查找樹等等。同樣的算法可以用于 Class類的forName()的實現。

當jvm發現還沒有加載過一個稱為"Lava"的類,它就開始查找并加載類 文件"Lava.class"。它從類文件中抽取類型信息并放在了方法區中。

jvm于是以一個直接指向方法區lava類的指針替換了常量池***項的符號 引用。以后就可以用這個指針快速的找到lava類了。而這個替換過程稱為 常量池解析(constant pool resolution)。在這里我們替換的是一個 native指針。

jvm終于開始為新的lava對象分配空間了。這次,jvm仍然需要方法區中 的信息。它使用指向lava數據的指針(剛才指向volcano常量池***項的指針) 找到一個lava對象究竟需要多少空間。

一旦jvm知道了一個Lava對象所要的空間,它就在堆上分配這個空間并把這個實例的變量speed初始化為缺省值0。假如lava的父對象也有實例變量,則也會初始化。

當把新生成的lava對象的引用壓到棧中,***條指令也結束了。下面的指令利用這個引用激活java代碼把speed變量設為初始值,5。另外一條指令會用這個引用激活 Lava對象的flow()方法。

(3)堆。存放運行時所有 對象 和 數組。

(4)棧。每次啟動一個新的線程,就會被分配一個棧。

(5)PC 寄存器(程序計數器)總是指向該線程下一步要執行的指令。指令的位置放在方法區的方法字節碼中。內容是相    對于***個指令的偏移量。

看完上述內容,你們對如何理解Java虛擬機及JVM體系結構是什么有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东平县| 定边县| 邢台县| 尖扎县| 溧水县| 万源市| 营口市| 吴旗县| 青冈县| 云梦县| 师宗县| 康乐县| 安泽县| 清流县| 凭祥市| 枝江市| 固始县| 古蔺县| 灵川县| 靖远县| 锡林浩特市| 邮箱| 门头沟区| 江华| 富平县| 耒阳市| 玉环县| 内乡县| 根河市| 民乐县| 泰顺县| 盐津县| 淄博市| 靖江市| 土默特左旗| 东乌| 永新县| 榆林市| 房产| 米易县| 姜堰市|