JVM載入一個類別的過程的圖文詳解
本文主要介紹了JVM載入一個類別的過程。具有很好的參考價值,以下跟著小編一起來看下吧
類別的載入過程
Java原始碼被編譯成class字節碼,JVM把描述類別資料的字節碼.Class檔案載入到內存,並對資料進行校驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的java類型,這就是虛擬機器的類別載入機制。
類別從被載入到虛擬機器記憶體開始,到卸載出記憶體為止,它的生命週期包括了:載入(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸載(Unloading)七個階段,其中驗證、準備、解析三個部分統稱連結。
載入(裝載)、驗證、準備、初始化和卸載這五個階段順序是固定的,類別的載入過程必須按照這種順序開始,而解析階段不一定;它在某些情況下可以在初始化之後再開始,這是為了運行時動態綁定特性(也稱為動態綁定或晚期綁定,例如重寫)。
1.載入:
在載入階段,虛擬機器主要完成三件事:
1.透過一個類別的全限定名稱來取得定義此類的二進位位元組流。
2.將這個位元組流所代表的靜態儲存結構轉換為方法區域的執行時間資料結構。
3.在Java堆中產生一個代表這個類別的java.lang.Class對象,作為方法區域資料的存取入口
#相對於類別載入過程的其他階段,載入階段(準備地說,是載入階段中取得類別的二進位位元組流的動作)是開發期可控性最強的階段,因為載入階段可以使用系統提供的類別載入器(ClassLoader)來完成,也可以由使用者自訂的類別載入器完成,開發人員可以透過定義自己的類別載入器去控製位元組流的取得方式。
載入階段完成後,虛擬機器外部的二進位位元組流就按照虛擬機所需的格式儲存在方法區之中,方法區中的資料儲存格式有虛擬機實現自行定義,虛擬機並未規定此區域的具體資料結構。然後在java堆中實例化一個java.lang.Class類別的對象,這個物件作為程式存取方法區中的這些類型資料的外部介面。
2.驗證:
驗證階段作用是確保Class檔案的位元組流包含的資訊符合JVM規範,不會對JVM造成危害。如果驗證失敗,就會拋出一個java.lang.VerifyError異常或其子類別異常。驗證流程分為四個階段
1.檔案格式驗證:驗證位元組流檔案是否符合Class檔案格式的規範,並且能被目前虛擬機器正確的處理。
2.元資料驗證:是對字節碼所描述的資訊進行語意分析,以確保其所描述的資訊符合Java語言的規格。
3.字節碼驗證:主要是進行資料流和控制流的分析,保證被校驗類別的方法在執行時不會危害虛擬機。
4.符號引用驗證:符號參考驗證發生在虛擬機器將符號引用轉換為直接引用的時候,這個轉換動作將在解析階段中發生。
3.準備:
準備階段為變數分配記憶體並設定類別變數的初始化。在這個階段分配的僅為類別的變數(static修飾的變數),而不是包含類別的實例變數。對已非final的變量,JVM會將其設為“零值”,而不是其賦值語句的值:
pirvate static int size = 12;
#那麼在這個階段, size的值為0,而不是12。 final修飾的類別變數將會賦值成真實的值。
4.解析:
解析階段是虛擬機器常數池內的符號參考替換為直接引用的過程。
符號引用:符號引用是一組符號來描述所引用的目標對象,符號可以是任何形式的字面量,只要使用時能無歧義地定位到目標即可。符號引用與虛擬機器實現的記憶體佈局無關,引用的目標物件並不一定已經載入到記憶體中。
直接引用:直接引用可以是直接指向目標物件的指標、相對偏移量或是一個能間接定位到目標的句柄。直接引用是與虛擬機器記憶體佈局實現相關的,同一個符號引用在不同虛擬機器實例上翻譯出來的直接引用一般不會相同,如果有了直接引用,那引用的目標必定已經在記憶體中存在。
虛擬機器規格並沒有規定解析階段發生的具體時間,只要求了在執行anewarry、checkcast、getfield、instanceof、invokeinterface、invokespecial、invokestatic、invokevirtual、multianewarray、new、putfield和putstatic這13個用於操作符號所引用的字節碼指令之前,先將它們所使用的符號引用進行解析,所以虛擬機器實作會根據需要來判斷,到底是在類別被載入器載入時就對常數池中的符號引用進行解析,還是等到一個符號引用將要被使用前才去解析它。
解析的動作主要針對類別或介面、欄位、類別方法、介面方法四類符號引用進行。分別對應編譯後常數池內的CONSTANT_Class_Info、CONSTANT_Fieldref_Info、CONSTANT_Methodef_Info、CONSTANT_InterfaceMethoder_Info四種常數型別。
1.類別、介面的解析
#2.欄位解析
3.類別方法解析
#4.介面方法解析
#5.初始化:
類別的初始化階段是類別載入過程的最後一步,在準備階段,類別變數已賦過一次系統要求的初始值,而在初始化階段,則是根據程式設計師透過程式製定的主觀計畫去初始化類別變數和其他資源,或者可以從另一個角度來表達:初始化階段是執行類別構造器
6.使用:
新執行緒---程式計數器----jvm棧執行(物件參考)-----堆疊記憶體(直接引用)----方法區
7 .卸載:
GC垃圾回收
以上是JVM載入一個類別的過程的圖文詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
![在Illustrator中載入插件時出錯[修復]](https://img.php.cn/upload/article/000/465/014/170831522770626.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
啟動AdobeIllustrator時是否會彈出載入插件時出錯的訊息?一些Illustrator用戶在打開該應用程式時遇到了此錯誤。訊息後面緊跟著一系列有問題的插件。此錯誤提示表示已安裝的插件有問題,但也可能是由於VisualC++DLL檔案損壞或首選項檔案受損等其他原因所引起。如果遇到此錯誤,我們將在本文中指導您修復問題,請繼續閱讀以下內容。在Illustrator中載入外掛程式時出錯如果您在嘗試啟動AdobeIllustrator時收到「載入外掛程式時出錯」的錯誤訊息,您可以使用以下用途:以管理員身

字幕在你的WindowsPC上不能在Stremio上運行嗎?一些Stremio用戶報告說,影片中沒有顯示字幕。許多用戶報告說他們遇到了一條錯誤訊息,上面寫著「載入字幕時出錯」。以下是與此錯誤一起顯示的完整錯誤訊息:載入字幕時出錯載入字幕失敗:這可能是您正在使用的插件或您的網路有問題。正如錯誤訊息所說,可能是您的網路連線導致了錯誤。因此,請檢查您的網路連接,並確保您的網路運作正常。除此之外,這個錯誤的背後可能還有其他原因,包括字幕加載項衝突、特定影片內容不支援字幕以及Stremio應用程式過時。如

css載入不出來的解決辦法有檢查檔案路徑、檢查檔案內容、清除瀏覽器快取、檢查伺服器設定、使用開發者工具和檢查網路連線等。詳細介紹:1、檢查檔案路徑,首先請確保CSS檔案的路徑正確,如果CSS檔案位於網站的不同部分或子目錄中,需要提供正確的路徑,如果CSS檔案位於根目錄下,路徑應該是直接的;2、檢查文件內容,如果路徑正確,那麼問題可能出在CSS文件本身,開啟CSS文件檢查等等。

如果您在插入超連結時出現在Outlook時遇到凍結問題,可能是因為網路連線不穩定、Outlook版本舊、防毒軟體幹擾或加載項衝突等原因。這些因素可能導致Outlook無法正常處理超連結操作。修正插入超連結時Outlook凍結的問題使用以下修復程式解決插入超連結時Outlook凍結的問題:檢查已安裝的加載項更新Outlook暫時停用您的防毒軟體,然後嘗試建立新的使用者設定檔修復辦公室應用程式卸載並重新安裝Office我們開始吧。 1]檢查已安裝的加載項可能是Outlook中安裝的某個加載項導致了問題。

掌握JVM記憶體使用量的重點與注意事項JVM(JavaVirtualMachine)是Java應用程式運作的環境,其中最為重要的就是JVM的記憶體管理。合理地管理JVM記憶體不僅可以提高應用程式的效能,還可以避免記憶體洩漏和記憶體溢位等問題。本文將介紹JVM記憶體使用的要點和注意事項,並提供一些具體的程式碼範例。 JVM記憶體分區JVM記憶體主要分為以下區域:堆(He

JavaScript如何實現滾動到頁面底部自動載入的無限滾動效果?無限滾動效果是現代網頁開發中常見的功能之一,它可以在滾動到頁面底部時自動加載更多內容,使得用戶可以無需手動點擊按鈕或連結就能夠獲取更多的數據或資源。在本文中,我們將探討如何使用JavaScript來實現這項功能,並提供具體的程式碼範例。實現滾動到頁面底部自動加載的無限滾動效果,主要分為以下

透過JVM命令列參數,您可以細微地調整JVM行為。其中通用參數包括:設定Java堆大小(-Xms、-Xmx)設定新生代大小(-Xmn)啟用平行垃圾收集器(-XX:+UseParallelGC)減少Survivor區記憶體佔用(-XX:-ReduceSurvivorSetInMemory)消除冗餘餘垃圾回收(-XX:-EliminateRedundantGCs)列印垃圾回收資訊(-XX:+PrintGC)使用G1垃圾收集器(-XX:-UseG1GC)設定最大垃圾回收暫停時間(-XX:MaxGCPau

什麼是物件導向程式設計?物件導向程式設計(OOP)是一種程式設計範式,它將現實世界中的實體抽象化為類,並使用物件來表示這些實體。類別定義了物件的屬性和行為,而物件則實例化了類別。 OOP的主要優點在於它可以使程式碼更易於理解、維護和重複使用。 OOP的基本概念OOP的主要概念包括類別、物件、屬性和方法。類別是物件的藍圖,它定義了物件的屬性和行為。物件是類別的實例,它具有類別的所有屬性和行為。屬性是物件的特徵,它可以儲存資料。方法是物件的函數,它可以對物件的資料進行操作。 OOP的優點OOP的主要優點包括:可重複使用性:OOP可以讓程式碼更
