這篇文章帶給大家的內容是關於Java類別載入過程的詳細介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
Java檔案從編碼到完成最終執行的過程:
- 編譯:Javac 把Java檔案編譯成.class檔案
- 執行:把.class檔案交給JVM運行
類別的載入過程
JVM虛擬機把.class檔案中類別資訊載入進內存,並進行解析產生對應的class物件的過程。 JVM不是一開始就把所有的類別都加載進記憶體中,而是只有第一次遇到某個需要運行的類別時才會加載,並且只加載一次。
載入
把class字節碼檔案從各個來源透過類別載入器載入到記憶體中
JVM要完成三件事
- 透過一個類別的全限定名稱來取得定義此類的二進位位元組流。
- 靜態儲存結構- > 方法區的執行時期資料結構
- 在Java堆中產生對應類別的java.lang.Class對象,作為方法區存取這些資料的存取入口。
類別載入器
- 啟動類別載入器
- 擴充類別載入器
- 應用類別載入器
- 自訂類別載入器
連線
將java類別的二進位程式碼合併到JVM的運行狀態之中的程序
驗證
保證載入的位元組流符合虛擬機器規範,不會造成安全錯誤
驗證分類
- 檔案格式的驗證,例如常數中是否有不被支持的常數?文件中是否有不規範的或附加的其他資訊
- 元資料的驗證,例如該類別是否繼承了被final修飾的類別?類別中的字段,方法是否與父類別衝突?是否出現了不合理的重載?
- 字節碼的驗證,保證程式語意的合理性,例如要保證類型轉換的合理性。
- 符號引用的驗證,例如校驗符號引用中透過全限定名稱是否能夠找到對應的類別?校驗符號引用中的存取性(private,public等)是否可被目前類別存取?
準備
為類別變數(注意,不是實例變數)分配內存,並且賦予初步值(Java虛擬機器根據不同變數類型的預設初始值)
預設初始值
- 8種基本型別的初步值,預設為0
- 引用型別的初步值則為null
- 常數的初步值即程式碼中設定的值
- final static tmp = 456
#解析
#常數池內的符號引用替換為直接引用的過程
#符號引用:一個字串,但是這個字串給了一些能夠唯一性識別一個方法,一個變量,一個類別的相關資訊
直接引用:可以理解為一個記憶體位址,或者一個偏移量
舉個例子來說,現在呼叫方法hello(),這個方法的位址是1234567,那麼hello就是符號引用,1234567就是直接引用
#解析階段,虛擬機會把所有的類別名,方法名,字段名這些符號引用替換為具體的記憶體位址或偏移量,也就是直接引用
初始化
對類別變數(static修飾的變數或語句)初始化,是執行類別建構器的過程
初始化過程
- 初始化一個類別的時候,其父類別尚未初始化,則優先初始化其父類別
- 同時包含多個靜態變數和靜態程式碼區塊,則依照自上而下的順序依序執行
以上是Java類別載入過程的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。

Java'splatformindependencefacilitatescodereusebyallowingbytecodetorunonanyplatformwithaJVM.1)Developerscanwritecodeonceforconsistentbehavioracrossplatforms.2)Maintenanceisreducedascodedoesn'tneedrewriting.3)Librariesandframeworkscanbesharedacrossproj

要解決Java應用程序中的平台特定問題,可以採取以下步驟:1.使用Java的System類查看系統屬性以了解運行環境。 2.利用File類或java.nio.file包處理文件路徑。 3.根據操作系統條件加載本地庫。 4.使用VisualVM或JProfiler優化跨平台性能。 5.通過Docker容器化確保測試環境與生產環境一致。 6.利用GitHubActions在多個平台上進行自動化測試。這些方法有助於有效地解決Java應用程序中的平台特定問題。

類加載器通過統一的類文件格式、動態加載、雙親委派模型和平台無關的字節碼,確保Java程序在不同平台上的一致性和兼容性,實現平台獨立性。

Java編譯器生成的代碼是平台無關的,但最終執行的代碼是平台特定的。 1.Java源代碼編譯成平台無關的字節碼。 2.JVM將字節碼轉換為特定平台的機器碼,確保跨平台運行但性能可能不同。

多線程在現代編程中重要,因為它能提高程序的響應性和資源利用率,並處理複雜的並發任務。 JVM通過線程映射、調度機制和同步鎖機制,在不同操作系統上確保多線程的一致性和高效性。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版

WebStorm Mac版
好用的JavaScript開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),