今天小編給大家分享的是JVM的詳細(xì)介紹,相信大部分人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,話不多說,一起往下看吧。
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供池州網(wǎng)站建設(shè)、池州做網(wǎng)站、池州網(wǎng)站設(shè)計(jì)、池州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、池州企業(yè)網(wǎng)站模板建站服務(wù),十多年池州做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。JVM的中文名稱叫Java虛擬機(jī),它是由軟件技術(shù)模擬出計(jì)算機(jī)運(yùn)行的一個(gè)虛擬的計(jì)算機(jī)。
JVM也充當(dāng)著一個(gè)翻譯官的角色,我們編寫出的Java程序,是不能夠被操作系統(tǒng)所直接識(shí)別的,這時(shí)候JVM的作用就體現(xiàn)出來了,它負(fù)責(zé)把我們的程序翻譯給系統(tǒng)“聽”,告訴它我們的程序需要做什么操作。
我們都知道Java的程序需要經(jīng)過編譯后,產(chǎn)生.Class文件,JVM才能識(shí)別并運(yùn)行它,JVM針對(duì)每個(gè)操作系統(tǒng)開發(fā)其對(duì)應(yīng)的解釋器,所以只要其操作系統(tǒng)有對(duì)應(yīng)版本的JVM,那么這份Java編譯后的代碼就能夠運(yùn)行起來,這就是Java能一次編譯,到處運(yùn)行的原因。
JVM在Java程序開始執(zhí)行的時(shí)候,它才運(yùn)行,程序結(jié)束的時(shí)它就停止。
一個(gè)Java程序會(huì)開啟一個(gè)JVM進(jìn)程,如果一臺(tái)機(jī)器上運(yùn)行三個(gè)程序,那么就會(huì)有三個(gè)運(yùn)行中的JVM進(jìn)程。
JVM中的線程分為兩種:守護(hù)線程和普通線程
守護(hù)線程是JVM自己使用的線程,比如垃圾回收(GC)就是一個(gè)守護(hù)線程。
普通線程一般是Java程序的線程,只要JVM中有普通線程在執(zhí)行,那么JVM就不會(huì)停止。
權(quán)限足夠的話,可以調(diào)用exit()方法終止程序。
1、JVM的裝入環(huán)境和配置
在學(xué)習(xí)這個(gè)之前,我們需要了解一件事情,就是JDK和JRE的區(qū)別。
JDK是面向開發(fā)人員使用的SDK,它提供了Java的開發(fā)環(huán)境和運(yùn)行環(huán)境,JDK中包含了JRE。
JRE是Java的運(yùn)行環(huán)境,是面向所有Java程序的使用者,包括開發(fā)者。
JRE = 運(yùn)行環(huán)境 = JVM。
如果安裝了JDK,會(huì)發(fā)現(xiàn)電腦中有兩套JRE,一套位于/Java/jre.../下,一套位于/Java/jdk.../jre下。那么問題來了,一臺(tái)機(jī)器上有兩套以上JRE,誰來決定運(yùn)行那一套呢?這個(gè)任務(wù)就落到j(luò)ava.exe身上,java.exe的任務(wù)就是找到合適的JRE來運(yùn)行java程序。
java.exe按照以下的順序來選擇JRE:
自己目錄下有沒有JRE
父目錄下有沒有JRE
這幾步的主要核心是為了找到JVM的絕對(duì)路徑。
jvm.cfg的路徑為:JRE路徑\lib\"CPU架構(gòu)"\jvm.fig
jvm.cfg的內(nèi)容大致如下:
KNOWN 表示存在 、IGNORE 表示不存在 、ALIASED_TO 表示給別的JVM去一個(gè)別名
WARN 表示不存在時(shí)找一個(gè)替代 、ERROR 表示不存在拋出異常
2、裝載JVM
通過第一步找到JVM的路徑后,Java.exe通過LoadJavaVM來裝入JVM文件。
LoadLibrary裝載JVM動(dòng)態(tài)連接庫,然后把JVM中的到處函數(shù)JNI_CreateJavaVM和JNI_GetDefaultJavaVMIntArgs 掛接到InvocationFunction 變量的CreateJavaVM和GetDafaultJavaVMInitArgs 函數(shù)指針變量上。JVM的裝載工作完成。
3、初始化JVM,獲得本地調(diào)用接口
調(diào)用InvocationFunction -> CreateJavaVM也就是JVM中JNI_CreateJavaVM方法獲得JNIEnv結(jié)構(gòu)的實(shí)例。
4、運(yùn)行Java程序
JVM運(yùn)行Java程序的方式有兩種:jar包 與 Class
運(yùn)行jar 的時(shí)候,Java.exe調(diào)用GetMainClassName函數(shù),該函數(shù)先獲得JNIEnv實(shí)例然后調(diào)用JarFileJNIEnv類中g(shù)etManifest(),從其返回的Manifest對(duì)象中取getAttrebutes("Main-Class")的值,即jar 包中文件:META-INF/MANIFEST.MF指定的Main-Class的主類名作為運(yùn)行的主類。之后main函數(shù)會(huì)調(diào)用Java.c中LoadClass方法裝載該主類(使用JNIEnv實(shí)例的FindClass)。
運(yùn)行Class的時(shí)候,main函數(shù)直接調(diào)用Java.c中的LoadClass方法裝載該類。
Class文件由Java編譯器生成,我們創(chuàng)建的.Java文件在經(jīng)過編譯器后,會(huì)變成.Class的文件,這樣才能被JVM所識(shí)別并運(yùn)行。
類加載子系統(tǒng)也可以稱之為類加載器,JVM默認(rèn)提供三個(gè)類加載器:
1、BootStrap ClassLoader :稱之為啟動(dòng)類加載器,是最頂層的類加載器,負(fù)責(zé)加載JDK中的核心類庫,如 rt.jar、resources.jar、charsets.jar等。
2、Extension ClassLoader:稱之為擴(kuò)展類加載器,負(fù)責(zé)加載Java的擴(kuò)展類庫,默認(rèn)加載$JAVA_HOME中jre/lib/*.jar 或 -Djava.ext.dirs指定目錄下的jar包。
3、App ClassLoader:稱之為系統(tǒng)類加載器,負(fù)責(zé)加載應(yīng)用程序classpath目錄下所有jar和class文件。
除了Java默認(rèn)提供的三個(gè)ClassLoader(加載器)之外,我們還可以根據(jù)自身需要自定義ClassLoader,自定義ClassLoader必須繼承java.lang.ClassLoader 類。除了BootStrap ClassLoader 之外的另外兩個(gè)默認(rèn)加載器都是繼承自java.lang.ClassLoader 。BootStrap ClassLoader 不是一個(gè)普通的Java類,它底層由C++編寫,已嵌入到了JVM的內(nèi)核當(dāng)中,當(dāng)JVM啟動(dòng)后,BootStrap ClassLoader 也隨之啟動(dòng),負(fù)責(zé)加載完核心類庫后,并構(gòu)造Extension ClassLoader 和App ClassLoader 類加載器。
類加載器子系統(tǒng)不僅僅負(fù)責(zé)定位并加載類文件,它還嚴(yán)格按照以下步驟做了很多事情:
1、加載:尋找并導(dǎo)入Class文件的二進(jìn)制信息
2、連接:進(jìn)行驗(yàn)證、準(zhǔn)備和解析
3、初始化:調(diào)用Java代碼,初始化類變量為指定初始值
在JVM中,類型信息和類靜態(tài)變量都保存在方法區(qū)中,類型信息是由類加載器在類加載的過程中從類文件中提取出來的信息。
需要注意的一點(diǎn)是,常量池也存放于方法區(qū)中。
程序中所有的線程共享一個(gè)方法區(qū),所以訪問方法區(qū)的信息必須確保線程是安全的。如果有兩個(gè)線程同時(shí)去加載一個(gè)類,那么只能有一個(gè)線程被允許去加載這個(gè)類,另一個(gè)必須等待。
在程序運(yùn)行時(shí),方法區(qū)的大小是可以改變的,程序在運(yùn)行時(shí)可以擴(kuò)展。
方法區(qū)也可以被垃圾回收,但條件非常嚴(yán)苛,必須在該類沒有任何引用的情況下
1、類型的全名(The fully qualified name of the type)
2、類型的父類型全名(除非沒有父類型,或者父類型是java.lang.Object)(The fully qualified name of the typeís direct superclass)
3、該類型是一個(gè)類還是接口(class or an interface)(Whether or not the type is a class )
4、類型的修飾符(public,private,protected,static,final,volatile,transient等)(The typeís modifiers)
5、所有父接口全名的列表(An ordered list of the fully qualified names of any direct superinterfaces)
6、類型的字段信息(Field information)
7、類型的方法信息(Method information)
8、所有靜態(tài)類變量(非常量)信息(All class (static) variables declared in the type, except constants)
9、一個(gè)指向類加載器的引用(A reference to class ClassLoader)
10、一個(gè)指向Class類的引用(A reference to class Class)
11、基本類型的常量池(The constant pool for the type)
為了更高效的訪問所有保存在方法區(qū)中的數(shù)據(jù),在方法區(qū)中,除了保存上邊的這些類型信息之外,還有一個(gè)為了加快存取速度而設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu):方法列表。每一個(gè)被加載的非抽象類,Java虛擬機(jī)都會(huì)為他們產(chǎn)生一個(gè)方法列表,這個(gè)列表中保存了這個(gè)類可能調(diào)用的所有實(shí)例方法的引用,保存那些父類中調(diào)用的方法。
當(dāng)Java創(chuàng)建一個(gè)類的實(shí)例對(duì)象或者數(shù)組時(shí),都在堆中為新的對(duì)象分配內(nèi)存。
虛擬機(jī)中只有一個(gè)堆,程序中所有的線程都共享它。
堆占用的內(nèi)存空間是最多的。
堆的存取類型為管道類型,先進(jìn)先出。
在程序運(yùn)行中,可以動(dòng)態(tài)的分配堆的內(nèi)存大小。
堆的內(nèi)存資源回收是交給JVM GC進(jìn)行管理的,
在Java棧中只保存基礎(chǔ)數(shù)據(jù)類型和自定義對(duì)象的引用,注意只是對(duì)象的引用而不是對(duì)象本身哦,對(duì)象是保存在堆區(qū)中的。
拓展知識(shí):像String、Integer、Byte、Short、Long、Character、Boolean這六個(gè)屬于包裝類型,它們是存放于堆中的。
棧的存取類型為類似于水杯,先進(jìn)后出。
棧內(nèi)的數(shù)據(jù)在超出其作用域后,會(huì)被自動(dòng)釋放掉,它不由JVM GC管理。
每一個(gè)線程都包含一個(gè)棧區(qū),每個(gè)棧中的數(shù)據(jù)都是私有的,其他棧不能訪問。
每個(gè)線程都會(huì)建立一個(gè)操作棧,每個(gè)棧又包含了若干個(gè)棧幀,每個(gè)棧幀對(duì)應(yīng)著每個(gè)方法的每次調(diào)用,每個(gè)棧幀包含了三部分:
局部變量區(qū)(方法內(nèi)基本類型變量、變量對(duì)象指針)
操作數(shù)棧區(qū)(存放方法執(zhí)行過程中產(chǎn)生的中間結(jié)果)
運(yùn)行環(huán)境區(qū)(動(dòng)態(tài)連接、正確的方法返回相關(guān)信息、異常捕捉)
關(guān)于jvm就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
分享名稱:JVM是什么?JVM的方法有哪些?-創(chuàng)新互聯(lián)
瀏覽路徑:http://jinyejixie.com/article18/dedggp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站內(nèi)鏈、搜索引擎優(yōu)化、網(wǎng)站改版、關(guān)鍵詞優(yōu)化、全網(wǎng)營(yíng)銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容