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