溫立輝



摘? 要:針對虛擬機的底層實現原理及相關實現過程,討論了Java語言的跨平臺原理以及相關工作機制,分析了JVM底層各數據區內存管理過程,闡述了JVM在Java語言中的核心作用以及重要地位。
關鍵詞:JVM;跨平臺;內存管理;解釋器;類加載
中圖分類號:TP312? ? ? ? ?文獻標志碼:A? ? ? ? ?文章編號:2095-2945(2020)05-0053-02
Absrtact: This paper discusses the cross platform principle and related working mechanism of Java language, analyzes the memory management process of each data area in the bottom layer of JVM, and expounds the core role and important position of JVM in Java language.
Keywords: JVM; cross platform; memory management; interpreter; class loading
1 概述
Java語言的閃耀點是其跨平臺特性,使其征服了網絡編程界,而Java虛擬機以其獨特的作用及強大的功能支撐起Java平臺的強大地位,Java虛擬機是連接應用程序與系統平臺及機器硬件的橋梁,是Java語言的核心基石。
2 Java平臺分層原理
1995年SUM公司正式對外發布了第一個版本的JDK后,在編程界引起了極大的反響,隨后幾年風靡編程領域,從此之后各類面向對象跨平臺編程猶如雨后春筍般的出現。把源文件轉換成字節碼文件,即可在各種環境中運行,是Java語言的重要特征及顯耀的光芒,為何其具有如此強大的能力,歸根到底就是因為虛擬機的重要作用。Java虛擬機在計算機編程領域又稱之為JVM,是一種用代碼語句來模擬計算機元件功能的實現包。
大家都清楚,Java語言即不是一種完全解釋型的語言,也不是一種完全編譯型的語言,其源碼文件會在編譯命令的執行過程中轉成字節碼文件,由于字節碼文件不是可執行文件,因而其不能直接被操作系統調用執行。字節碼是一種字節流文件,其以class類型的文件存在,是一種跟平臺不相耦合的類型文件,需要經過JVM的翻譯轉換才能被硬件環境識別。Java平臺體系結構可分為四層:最上面的為Java應用程序層;在此層的下面是API接口層,此層包含了眾多的JDK核心類庫;再往下一層就是JVM位置所在,JVM在此層完成字節碼解釋轉換工作,JVM層與API層共同構成Java語言的運行時環境(JRE);最下面一層為機器硬件平臺層,此層直接執行由JVM解釋出來的二進制命令。
3 虛擬機工作原理
Java虛擬機是操作系統中的一個job,所有Java應用程序均歸屬某一個虛擬機實例,當運行作為Java程序起點的Main方法時,JVM便被創建。JVM便被創建后,在虛擬機job運行過程中會創建守護線程,守護線程的作用是監測非守護線程的執行過程,保障程序的完整執行,直到應用程序的退出。
Java虛擬機是連接應用與操作平臺的橋梁,從字節碼文件變成可執行的機器命令,JVM的工作過程包含七個步驟,分別是:字節碼裝載、字節流校驗、靜態變量初始化、引用轉換、對象實例化、反射調用、GC回收,如表1所示。
第一步,裝載class類型文件到內存中。本階段的目標是要對數據進行初始化處理,銜接后繼步驟,完成整個JVM工作過程的第一步。
在這一階段所要實現的具體內容是要通過類名來定位并導入相關的字節流,并生成一個與此類相關聯的類型對象,作為該類的操作入口。
第二步,進行類的鏈接操作。在這一階段主要負責將二進制字節流的數據裝入JRE環境,此階段包含三個過程:字節流校驗、靜態變量分配內存空間、引用轉換。
驗證過程完成對源碼類的檢查,以維護JVM自身的安全;準備過程完成源碼類型結構的初始化;解析過程直接對常量值初始化。
第三步,進行Java類的對象實例化過程。此步是加載過程最后一步,在此階段所要完成的任務是:執行超類、子類中各種靜態語句塊,按順序執行父類、子類的構造器函數完成實例化過程。
第四步,運行Java類的相關功能。在此階段類的功能可以被機器以指令的方式執行。
第五步,卸載運行完畢的類對象。經過垃圾回收機制(GC)處理的最終會被JVM從內存中卸載。
4 虛擬機內存管理
虛擬機運行時會將正在使用的內存空間劃分為不同的區域,每個區域負責不同的功能,各個區域的創建,銷毀過程也都不相同。總的來說,JVM內存空間劃分為兩大塊,數據共享區與私有區,每大塊又可以進一步細分,如表2。
全局變量區:用于存儲源碼類中的全局變量,為各個線程的內存數據共享區域。
實例區:存放用new關鍵字定義并經過初始化的實例,此區空間會被GC釋放,同為數據共享區。
局部變量區:用于存儲源碼類中的局部變量,數據為特定線程專用。局部變量周期與實例線程相同,為數據私有區,不可共享。
本地方法區:與局部變量區類似,只為本地局部Native方法使用,部分JVM中也會將其與虛擬機棧合并為一,同為數據私有區,不可共享。
字節碼指令區:存儲實例線程下一步所要執行的計算機指令,同為數據私有區,不可共享。
5 類加載機制
在JRE環境中,有多個層級的類加載器,如表3所示。最頂層的為:JDK根類加載器(Bootstrap),此類為所有類加載器的總父類,次級類加載器(Extension)為其子類,直接繼承了此父加載器,次級加載器類下面同樣也存在一個繼承子類,三級類加載器(Application),在此子類中開放了自定義接口,自用戶可根據實際需要編碼以實現自定義加載器的開發。
同時在JRE環境中,加載器的裝載過程采用的是向上傳遞裝載的實現方式,當加載器收到請求要進行類裝載時,其會把相關請求發送給其直接父類,父加載器同樣會把請求向上遞歸傳遞,直到最頂層加載器。當最頂層的加載器無法完成裝載任務時,才會把請求交由子類完成,這就保證了在任務場景下類的加載任務均由最高的類加載器完成,保證了所有類型的實例對象具有相同的一致性,以避免應用程序的混亂。
6 結束語
虛擬機并不是真正的機器,是一種通過代碼來實現硬件功能的插件包。虛擬機有自己的模擬硬件環境,如全局及局部變量區、本地方法區、字節碼區、實例區等,還有自己的指令系統。對Java語言跨平臺特性而言,虛擬機是其核心構件,其直接關系應用程序的完整、健康執行,是Java語言的中樞組件。
參考文獻:
[1]蘭斌.JVM優點與缺點的深入分析[J].辦公自動化,2013(3):22-24.
[2]張鵬宇,鄭寶林.淺析JVM性能規范[J].計算機光盤軟件與應用,2011(3):111.
[3]胡雯.Java虛擬機內存分配探析[J].軟件導刊,2010(7):29-30.
[4]劉冠梅.JAVA虛擬機技術研究與實踐思考[J].科技創新與應用,2015(11):104-105.
[5]楊文超.Java虛擬機內存管理與優化策略[J].電子測試,2013(10):43-44+62.
[6]李卓恒.JAVA虛擬機相關技術研究與實踐[J].科技創新導報,2018,15(01):156+158.
[7]顧瑋.Java虛擬機的分析與研究[J].辦公自動化,2017,22(09):35-36+11.