日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA JVM原理详解

發布時間:2025/3/19 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA JVM原理详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

? JVM一直是java知識里面進階階段的重要部分,如果希望在java領域研究的更深入,則JVM則是如論如何也避開不了的話題,本系列試圖通過簡潔易讀的方式,講解JVM必要的知識點。

運行流程

? 我們都知道java一直宣傳的口號是:一次編譯,到處運行。那么它如何實現的呢?我們看下圖:

? java程序經過一次編譯之后,將java代碼編譯為字節碼也就是class文件,然后在不同的操作系統上依靠不同的java虛擬機進行解釋,最后再轉換為不同平臺的機器碼,最終得到執行。這樣我們是不是可以推演,如果要在mac系統上運行,是不是只需要安裝mac java虛擬機就行了。那么了解了這個基本原理后,我們嘗試去做更深的研究,一個普通的java程序它的執行流程到底是怎樣的呢?例如我們寫了一段這樣的代碼:

public class HelloWorld { public static void main(String[] args) { System.out.print("Hello world"); } }

這段程序從編譯到運行,最終打印出“Hello world”中間經過了哪些步驟呢?我們直接上圖:

? java代碼通過編譯之后生成字節碼文件(class文件),通過:java HelloWorld執行,此時java根據系統版本找到jvm.cfg,各位可以搜索一下自己電腦上的jvm.cfg文件在哪,它會根據你的系統版本放在不同的位置,比如我的這個文件就在:C:\Program Files\Java\jdk1.8.0_101\jre\lib\amd64\jvm.cfg,打開看一下:

? 這是我電腦上的文件,其中-server KNOWN就表示名稱為server的jvm可用。如果這時你搜索一下你電腦上jvm.dll,你就會發現它一定在你的某個server目錄下,比如我的:C:\Program Files\Java\jdk1.8.0_101\jre\bin\server\jvm.dll。簡而言之就是通過jvm.cfg文件找到對應的jvm.dll,jvm.dll則是java虛擬機的主要實現。接下來會初始化JVM,并且獲取JNI接口,什么是JNI接口,就是java本地接口,你想啊java被編譯成了class文件,JVM怎么從硬盤上找到這個文件并裝載到JVM里呢,就是通過JNI接口(它還常用于java與操作系統、硬件交互),找到class文件后并裝載進JVM,然后找到main方法,最后執行。

JVM基本結構

? 可能通過上面的描述,大家對JVM運行流程有了一個粗略的認識,那么JVM內部到底是怎么執行一個class文件的呢,也就是上圖中最后一步第6步的內部細節是怎樣的呢?要了解這個問題,我們首先得看一下JVM的內部結構:

? 從這個結構不難看出,class文件被jvm裝載以后,經過jvm的內存空間調配,最終是由執行引擎完成class文件的執行。當然這個過程還有其他角色模塊的協助,這些模塊協同配合才能讓一個java程序成功的運行,下面就詳細介紹這些模板,它們也是后面學習jvm最重要的部分。

內存空間:

JVM內存空間包含:方法區、java堆、java棧、本地方法棧。

方法區是各個線程共享的區域,存放類信息、常量、靜態變量。

java堆也是線程共享的區域,我們的類的實例就放在這個區域,可以想象你的一個系統會產生很多實例,因此java堆的空間也是最大的。如果java堆空間不足了,程序會拋出OutOfMemoryError異常。

java棧是每個線程私有的區域,它的生命周期與線程相同,一個線程對應一個java棧,每執行一個方法就會往棧中壓入一個元素,這個元素叫“棧幀”,而棧幀中包括了方法中的局部變量、用于存放中間狀態值的操作棧,這里面有很多細節,我們以后再講。如果java棧空間不足了,程序會拋出StackOverflowError異常,想一想什么情況下會容易產生這個錯誤,對,遞歸,遞歸如果深度很深,就會執行大量的方法,方法越多java棧的占用空間越大。

每個幀代表一個方法,Java方法有兩種返回方式,return和拋出異常,兩種方式都會導致該方法對應的幀出棧和釋放內存。

?③?棧運行原理

?????棧中的數據都是以棧幀(Stack Frame)的格式存在,棧幀是一個內存區塊,是一個數據集,是一個有關方法和運行期數據的數據集,當一個方法A被調用時就產生了一個棧幀F1,并被壓入到棧中,A方法又調用了B方法,于是產生棧幀F2也被壓入棧,B方法又調用了C方法,于是產生棧幀F3也被壓入棧…… 依次執行完畢后,先彈出后進......F3棧幀,再彈出F2棧幀,再彈出F1棧幀。

?????遵循“先進后出”/“后進先出”原則。

????幀的組成:局部變量區(包括方法參數和局部變量,對于instance方法,還要首先保存this類型,其中方法參數按照聲明順序嚴格放置,局部變量可以任意放置),操作數棧,幀數據區(用來幫助支持常量池的解析,正常方法返回和異常處理)。

本地方法棧角色和java棧類似,只不過它是用來表示執行本地方法的,本地方法棧存放的方法調用本地方法接口,最終調用本地方法庫,實現與操作系統、硬件交互的目的。

PC寄存器,說到這里我們的類已經加載了,實例對象、方法、靜態變量都去了自己改去的地方,那么問題來了,程序該怎么執行,哪個方法先執行,哪個方法后執行,這些指令執行的順序就是PC寄存器在管,它的作用就是控制程序指令的執行順序。

執行引擎當然就是根據PC寄存器調配的指令順序,依次執行程序指令。

靜態變量+常量+類信息+運行時常量池存在方法區中,實例變量存在堆內存中。

基本類型的變量和對象的引用變量都是在函數的棧內存中分配。

總結

以上是生活随笔為你收集整理的JAVA JVM原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。