免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
深入淺出:圖形化淺析JAVA程序運行模式及虛擬機JVM

本文主要對Java程序的執(zhí)行模式和JVM的架構原理進行較易理解的介紹和剖析,以便能更好的掌握Java的核心機制和基本原理,拋磚引玉,以便引起Java愛好這的興趣。如果覺得有用,請點個贊,順手分享本文。Thanks a lot.

一、Java程序的兩個環(huán)境

所謂Java程序,即用Java語言編寫的程序,它包含數據、代碼以及相關算法。而一個有效的java程序,滿足兩個環(huán)境的要求,即編譯環(huán)境和運行環(huán)境。如下圖所示:

圖-1:Java程序運行環(huán)

根據上圖所示:

其一,在編譯環(huán)境中,我們基于Java語言和JDK(Java開發(fā)工具包),進行源程序的代碼編寫,并在確保正確的情況下,通過工具包提供編譯器,把所有源代碼(即.java)編譯成(通過javac命令實現)字節(jié)碼文件(即.class文件)。

其二,在運行時環(huán)境執(zhí)行程序,或說運行程序。這時,需要先擁有待運行程序的字節(jié)碼文件。這些字節(jié)碼文件有可能通過網絡或者在本地兩種方式傳遞到運行時環(huán)境。

運行時環(huán)境中主要的工作就是啟動Java虛擬機,并通過虛擬機來完成一系列工作,實現java程序的運行。需要注意的是,在java虛擬執(zhí)行程序時,它會根據需要來加載Java提供的相關API的class文件。

二、Java的JVM運行結構

基于上面的java程序運行的框架圖,我們進一步來透視java的核心基石,即java虛擬機JVM的內部運行組成。

根據Java的虛擬機規(guī)范,JVM內部抽象體系結構主要有這樣幾大部分組成,即類裝載器子系統(tǒng)、執(zhí)行引擎以及運行時數據管理區(qū),同時要求支持本地方法的調用機制。那么這樣一來,我們進一步細化Java程序的JVM內部執(zhí)行機制,就形成如下的Java運行模式架構:

圖-2:JVM運行流程結構圖

三、JVM的架構原理和運行機制

經過上一部分的內容的抽象和總結,那么我們可以進一步抽象出基于java虛擬機規(guī)范實現的一般的JVM實現組成架構以及其運行機制和原理。JVM詳細的參考架構圖如下:

圖-3:虛擬機JVM參考實現圖

針對上圖JVM參考架構,作簡要說明如下:

虛擬機JVM主要有三個子系統(tǒng)構成:

1-類裝入器子系統(tǒng)

2-運行時數據區(qū)

3-執(zhí)行引擎

1.類裝入器子系統(tǒng)

Java的動態(tài)類加載功能是由類裝入器子系統(tǒng)。 由他進行類的裝載、鏈接、并初始化類文件時,是指一個類第一次運行時,而不是編譯時間。

1.1類加載

1)Bootstrap類加載器

負責加載$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++實現,不是ClassLoader子類

2)Extension類加載器

負責加載java平臺中擴展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包

3)Application類加載器

負責記載classpath中指定的jar包及目錄中class

4)Custom類加載器

屬于應用程序根據自身需要自定義的ClassLoader,如tomcat、jboss都會根據j2ee規(guī)范自行實現ClassLoader。加載過程中會先檢查類是否被已加載,檢查順序是自底向上,從Custom ClassLoader到BootStrap ClassLoader逐層檢查,只要某個classloader已加載就視為已加載此類,保證此類只所有ClassLoader加載一次。而加載的順序是自頂向下,也就是由上層來逐層嘗試加載此類。

1.2連接

驗證——字節(jié)碼校驗器會檢查生成的字節(jié)碼是否正確,如果驗證失敗則會驗證錯誤。

準備——對于所有靜態(tài)變量的內存分配和默認值分配。

識別——解析或識別是從運行時常量池的符號引用中動態(tài)具體值的過程。

1.3初始化

這是類裝入的最后階段, 類或接口的初始化由執(zhí)行類或接口初始化方法構成。這里所有的靜態(tài)變量與原來的值將被指派,靜態(tài)塊將被執(zhí)行。

2.運行時數據區(qū)

運行時數據區(qū)域分為5個主要組件:

方法區(qū)——所有的類級別的數據將存儲在這里,包括靜態(tài)變量。 每個JVM區(qū)域只有一個方法,它是一個共享資源。一般會包含一個運行時常量池(運行時常量池:一個存儲了類文件格式中的常量池表的內存空間。這部分空間雖然存在于方法區(qū)內,但卻在JVM操作中扮演著舉足輕重的角色,因此JVM規(guī)范單獨把這一部分拿出來描述。除了每個類或接口中定義的常量,它還包含了所有對方法和字段的引用。因此當需要一個方法或字段時,JVM通過運行時常量池中的信息從內存空間中來查找其相應的實際地址)。

堆區(qū)域——所有的對象和相應的實例變量和數組將存儲在這里。 還有一堆區(qū)域每個JVM。 自方法和堆區(qū)域多個線程共享內存,存儲的數據不是線程安全的。

棧區(qū)域——每一個線程創(chuàng)建一個單獨的運行時堆棧。 對于每一個方法調用,一個稱為棧內存棧幀被創(chuàng)建。 所有局部變量將被創(chuàng)建在棧內存中。 棧區(qū)域是線程安全的,因為它不是一個共享資源。 棧幀分三個實體:

其一,局部變量數組——有多少相關的方法局部變量以及相應的值將被存儲在這里。

其二,操作數棧——如果任何中間操作要求執(zhí)行,操作數棧作為運行時工作區(qū)執(zhí)行操作。

其三,幀數據——所有的符號對應的方法存儲在這里。 在任何的情況下異常catch塊信息將保存在幀數據。

程序計數器——每個線程必須分開程序計數器登記,當前執(zhí)行的指令一旦執(zhí)行,程序計數器(程序計數登記器)更新下一個指令。

本地方法棧——本地方法棧保存本機方法的信息。 為每一個線程將創(chuàng)建一個單獨的本地方法棧,以備不時之用。

3.執(zhí)行引擎

通過類裝載器裝載的,被分配到JVM的運行時數據區(qū)的字節(jié)碼會被執(zhí)行引擎執(zhí)行。執(zhí)行引擎以指令為單位讀取Java字節(jié)碼。它就像一個CPU一樣,一條一條地執(zhí)行機器指令。每個字節(jié)碼指令都由一個1字節(jié)的操作碼和附加的操作數組成。執(zhí)行引擎取得一個操作碼,然后根據操作數來執(zhí)行任務,完成后就繼續(xù)執(zhí)行下一條操作碼。如下圖所示:

不過Java字節(jié)碼是用一種人類可以讀懂的語言編寫的,而不是用機器可以直接執(zhí)行的語言。因此,執(zhí)行引擎必須把字節(jié)碼轉換成可以直接被JVM執(zhí)行的語言。字節(jié)碼可以通過以下兩種方式轉換成合適的語言。執(zhí)行引擎主要包括3部分內容:

(1)解釋器:一條一條地讀取,解釋并且執(zhí)行字節(jié)碼指令。因為它一條一條地解釋和執(zhí)行指令,所以它可以很快地解釋字節(jié)碼,但是執(zhí)行起來會比較慢。這是解釋執(zhí)行的語言的一個缺點。字節(jié)碼這種“語言”基本來說是解釋執(zhí)行的。

(2)即時(Just-In-Time)編譯器:即時編譯器被引入用來彌補解釋器的缺點。執(zhí)行引擎首先按照解釋執(zhí)行的方式來執(zhí)行,然后在合適的時候,即時編譯器把整段字節(jié)碼編譯成本地代碼。然后,執(zhí)行引擎就沒有必要再去解釋執(zhí)行方法了,它可以直接通過本地代碼去執(zhí)行它。執(zhí)行本地代碼比一條一條進行解釋執(zhí)行的速度快很多。編譯后的代碼可以執(zhí)行的很快,因為本地代碼是保存在緩存里的。

不過,用JIT編譯器來編譯代碼所花的時間要比用解釋器去一條條解釋執(zhí)行花的時間要多。因此,如果代碼只被執(zhí)行一次的話,那么最好還是解釋執(zhí)行而不是編譯后再執(zhí)行。因此,內置了JIT編譯器的JVM都會檢查方法的執(zhí)行頻率,如果一個方法的執(zhí)行頻率超過一個特定的值的話,那么這個方法就會被編譯成本地代碼。JIT中不要構成如下:

2中間代碼生成器(Intermediate Code Generator):生成中間代碼

2代碼優(yōu)化器(Code Optimizer):負責優(yōu)化上面生成的中間代碼

2目標代碼生成器(Target Code Generator):負責生成機器代碼或本地代碼

2分析器(Profiler):一個特殊組件,負責查找熱點,即該方法是否被多次調用;

可以簡單這樣理解,JIT編譯器通過中間代碼生成器生成中間代碼,再通過代碼優(yōu)化器負責優(yōu)化生成中間代碼,最后由目標代碼生成器負責生成機器代碼或本機代碼。在這過程中,JIT的分析器,一個特殊的組件,負責尋找熱點,即是否多次調用的方法,再執(zhí)行上述操作。

(3)垃圾收集器(Garbage Collector):收集和刪除未引用的對象??梢酝ㄟ^調用System.gc()觸發(fā)垃圾收集,但不能保證執(zhí)行。JVM的垃圾回收對象是已創(chuàng)建的對象。

另外,Java Native Interface(JNI): JNI將與本機方法庫進行交互,并提供執(zhí)行引擎所需的本機庫。本地方法庫(Native Method Libraries)是執(zhí)行引擎所需的本機庫的集合。

(文末)——謝謝閱讀,希望對你有所幫助。別忘了,點個贊、分享本文,并關注本頭條號喲~


本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java vs C++
JVM內存分析,以及一步步詳解Java程序是如何運行的?
JVM系列(一) - JVM總體概述
談談java的運行機制
我從馮·諾依曼計算機體系,追溯到了JVM,一切原來如此
面經手冊 · 第23篇《JDK、JRE、JVM,是什么關系?》
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服