JAVA文件的執行過程
平時我們都使用 idea、eclipse 等軟件來編寫代碼,在編寫完之后直接點擊運行就可以啟動程序了,那么這個過程是怎么樣的?
總體過程
我們編寫的 Java 文件在由編譯器編譯后會生成對應的 class 字節碼文件, 然后再將 class 字節碼文件轉給 JVM 。 JVM 會處理解析 class 文件,將其內部設置的類、方法、常量等信息全部提取出來,然后找到 main 方法開始一步一步編譯成機器碼并執行,中間會根據需要調用前面提取的數據。
那為什么不讓 JVM 直接編譯 java 文件呢?這樣效率不是更高么?
首先要知道 java 之所以強大,原因之一就是 JVM 的強大。
強大之一是 JVM 是 " 跨平臺 " 的。無論在哪種操作系統上執行,都可以轉成對應的機器語言,不需要擔心適配問題。
第二點就是 JVM 是 " 跨語言 " 的,因為 JVM 只認 class 文件,所以其他語言只需要一個編譯器編譯成 class 文件就可以使用 JVM 來編譯執行了。
組件分析
根據上面的說明可以知道 java 程序執行的核心是通過 JVM 來實現的,那么就需要知道 JVM 內部是如何執行的。
JVM 內部可以分為四大部分,運行時數據區域、類加載系統、執行引擎、本地接口和本地方法庫。
類加載系統:主要就是指類加載器,用于把 class 數據文件加載到運行時數據區域,然后由數據區域來編譯執行。
運行數據區域:搭配執行引擎來編譯傳來的文件中的代碼,然后執行,并且根據需要通過本地方法接口調用本地方法。
執行引擎:主要用于代碼的編譯和 運行時對象的回收。
本地庫接口和本地方法庫:提供一些 java 無法實現,需要底層執行調用的方法,是 jvm 訪問底層的重要途徑。
類加載器
用于進行類的加載。
種類
一般分為啟動類加載器、擴展類加載器、應用程序類加載器、自定義類加載器。圖中的從自定義類加載器到啟動類加載器一層一層使用箭頭連接, 這種箭頭并不是繼承關系,而是上下級關系。上下級的聯系是通過 ClassLoader 抽象類繼承過來的 parent 屬性設置的。
1、啟動類加載器(Bootstrap ClassLoader)(引導類加載器),加載java 核心類庫( /jre/lib/rt.jar),?無法被java程序直接引用,是用C++編寫的?,用來加載其他的類加載器(類加載器本質就是類),是所有加載器的父類。
2、拓展類加載器(Extension ClassLoader),用來加載java 的拓展庫(
3、系統類加載器(System ClassLoader )(應用程序類加載器),用來加載類路徑下的 Java類
4、用戶自定義類加載器,繼承java.lang.ClassLoader類的方式實現。
官方文檔中將類加載器分為引導類加載器和自定義類加載器,這是因為引導類加載器是使用其他語言實現的,而拓展類、系統類、自定義類加載器全部都是通過繼承 ClassLoader 抽象類實現的,所以都統一被劃分為自定義類加載器。
Java JVM
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。