更新時間:2020-10-22 17:18:15 來源:動力節(jié)點 瀏覽1415次
我們知道java語言的特點之一是跨平臺性,而JVM是java跨平臺的關(guān)鍵所在。JVM上執(zhí)行java字節(jié)碼,執(zhí)行時這些字節(jié)碼可以解釋成具體平臺的機器碼,學習JVM運行機制以及原理,會懂得為什么java語言擁有“一次編譯,處處運行”這一跨平臺能力。
什么是JVM呢?JVM是Java Virtual Machine(Java虛擬機)的縮寫,是一個虛構(gòu)出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。Java虛擬機主要由字節(jié)碼指令集、寄存器、棧、垃圾回收堆和存儲方法域等構(gòu)成。JVM屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息,使java程序只需生成在java虛擬機上運行的目標代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行。
要知道JVM運行機制,對JVM內(nèi)存模型的構(gòu)成要了解,我們從內(nèi)存模型來理解JVM運行機制。JVM內(nèi)存模型主要由堆內(nèi)存、方法區(qū)、程序計數(shù)器、虛擬機棧和本地方法棧組成,其組成的結(jié)構(gòu)如下圖所示:
堆內(nèi)存:堆內(nèi)存是所有線程共有的,可以分為兩個部分:年輕代和老年代。下圖中的Perm代表的是永久代,但是注意永久代并不屬于堆內(nèi)存中的一部分,同時jdk1.8之后永久代也將被移除。堆內(nèi)存是我們在生產(chǎn)環(huán)境中進行內(nèi)存性能調(diào)優(yōu)中的一個重要的內(nèi)容,而內(nèi)存回收的一些機制和算法也是在java面試題中常出現(xiàn)的考察內(nèi)容。
方法區(qū):方法區(qū)與java堆一樣,是各個線程共享的區(qū)域,它用于存儲已被虛擬機加載的類信息,常量,靜態(tài)變量,即時編譯(JIT)后的代碼等數(shù)據(jù)。由于程序中所有的線程共享一個方法區(qū),所以訪問方法區(qū)的信息必須確保線程是安全的。如果有兩個線程同時去加載一個類,那么只能有一個線程被允許去加載這個類,另一個必須等待。在程序運行時,方法區(qū)的大小是可以改變的,程序在運行時可以擴展。同時,方法區(qū)里面的對象也可以被垃圾回收,但條件非常嚴苛,必須在該類沒有任何引用的情況下才能被GC回收。
程序計數(shù)器:JVM的多線程是通過線程輪流切換并分配處理器執(zhí)行時間的方式來實現(xiàn)的,為了各條線程之間的切換后計數(shù)器能恢復到正確的執(zhí)行位置,所以每條線程都會有一個獨立的程序計數(shù)器。當線程正在執(zhí)行一個Java方法,程序計數(shù)器記錄的是正在執(zhí)行的JVM字節(jié)碼指令的地址;如果正在執(zhí)行的是一個Natvie(本地方法),那么這個計數(shù)器的值則為空。程序計數(shù)器占用的內(nèi)存空間很少,也是唯一一個在JVM規(guī)范中沒有規(guī)定任何內(nèi)存不足錯誤的區(qū)域。
Java虛擬機棧:與程序計數(shù)器一樣,Java虛擬機棧也是線程私有的,用通俗的話將它就是我們常常聽說到堆棧中的那個“棧內(nèi)存”。虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法在執(zhí)行的同時都會創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表(局部變量表需要的內(nèi)存在編譯期間就確定了所以在方法運行期間不會改變大小),操作數(shù)棧,動態(tài)鏈接,方法出口等信息。每一個方法從調(diào)用至出棧的過程,就對應著棧幀在虛擬機中從入棧到出棧的過程。
本地方法棧:棧作為一種線性的管道結(jié)構(gòu),遵循先進后出的原則。主要用于存儲本地方法的局部變量表,本地方法的操作數(shù)棧等信息。當棧內(nèi)的數(shù)據(jù)在超出其作用域后,會被自動釋放掉。本地方法棧是在程序調(diào)用或JVM調(diào)用本地方法接口(Native)時候啟用。
JVM的生命周期,JVM在Java程序開始執(zhí)行的時候,它才運行,程序結(jié)束的時它就停止。一個Java程序會開啟一個JVM進程,如果一臺機器上運行三個程序,那么就會有三個運行中的JVM進程。JVM中的線程分為兩種:守護線程和普通線程,守護線程是JVM自己使用的線程,比如垃圾回收(GC)就是一個守護線程;普通線程一般是Java程序的線程,只要JVM中有普通線程在執(zhí)行,那么JVM就不會停止。
以上是對JVM運行機制的解釋介紹,希望大家可以認真學習,JVM虛擬機是構(gòu)成java編程技術(shù)體系的重要一部分,對JVM運行機制原理理解好了后,才可以在java教程中更好的學習到虛擬機更多更深入的知識點。