今天就跟大家聊聊有關(guān)深入淺析JVM的結(jié)構(gòu)體系,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),崇明企業(yè)網(wǎng)站建設(shè),崇明品牌網(wǎng)站建設(shè),網(wǎng)站定制,崇明網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,崇明網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
JVM 是一種抽象的計(jì)算機(jī),基于堆棧架構(gòu),它有自己的指令集和內(nèi)存管理,是 Java 跨平臺(tái)的依據(jù),JVM解釋執(zhí)行字節(jié)碼,或?qū)⒆止?jié)碼編譯成本地代碼執(zhí)行。Java 虛擬機(jī)體系結(jié)構(gòu)如下:

Class File
Class File 是平臺(tái)無(wú)關(guān)的二進(jìn)制文件,包含著能被JVM執(zhí)行的字節(jié)碼,其中多字節(jié)采用大端序,字符使用一種改進(jìn)的UTF-8編碼。Class文件精確的描述了一個(gè)類或接口的信息,其中包括:
Class Loader
類加載器,JVM在類首次使用時(shí)動(dòng)態(tài)的加載、鏈接和初始化。JVM默認(rèn)的加載模型是雙親委派模型,類加載器之間存在父子關(guān)系的層次結(jié)構(gòu),內(nèi)部使用組合實(shí)現(xiàn)。此外還有其他的加載方式,比如Servlet加載,它先嘗試自己加載,不成功再委派上層加載器,類隔離;OSGI加載器之間是一種網(wǎng)狀的依賴關(guān)系,沒(méi)有上下層的區(qū)分,比較靈活。
加載
加載就是將Class文件表示的類或接口,在JVM方法區(qū)中創(chuàng)建一個(gè)與之對(duì)應(yīng)的java.lang.Class對(duì)象,像Class.forName()、ClassLoader.loadClass()、反射都能觸發(fā)類加載。當(dāng)觸發(fā)一個(gè)類加載時(shí),詳細(xì)的過(guò)程如下:
當(dāng)ClassLoader在classpath中未找到類文件,會(huì)拋出ClassNotFoundException;當(dāng)類A引用類B,類A已經(jīng)成功加載,但是加載B時(shí)未找到類文件,會(huì)拋出NoClassDefFoundError。JVM有以下幾種類加載器:
鏈接
初始化
執(zhí)行類初始化方法,即賦值靜態(tài)字段,執(zhí)行靜態(tài)塊,順序按照其定義的先后。父類的靜態(tài)域會(huì)先于子類靜態(tài)域初始化。
至此,一個(gè)類或接口被加載到了內(nèi)存中,JVM會(huì)保證整個(gè)過(guò)程是線程安全的。需要注意的是整個(gè)過(guò)程沒(méi)有涉及到任何實(shí)例對(duì)象。
運(yùn)行時(shí)數(shù)據(jù)區(qū)
1. Method Area:線程共享,存儲(chǔ)運(yùn)行時(shí)常量池、類字段和方法信息、靜態(tài)變量和方法的字節(jié)碼,是堆的邏輯組成部分,這部分的垃圾回收是可選的。值得一提的是Hotspot JVM自JDK8之后,調(diào)整了這部分內(nèi)存的內(nèi)容,class meta-data的分配使用本地內(nèi)存,interned String和類靜態(tài)變量移動(dòng)到了Java堆。
2. 運(yùn)行時(shí)常量池:對(duì)于JVM來(lái)說(shuō)具有核心作用,基本上涉及到方法或字段,JVM就會(huì)在運(yùn)行時(shí)常量池中搜索其具體的內(nèi)存地址。
3. Heap:線程共享,存儲(chǔ)實(shí)例對(duì)象,實(shí)例變量以及數(shù)組,是垃圾回收的主要區(qū)域。
4. JVM Stack:線程私有,用于存儲(chǔ)棧幀,當(dāng)方法被調(diào)用時(shí)會(huì)創(chuàng)建一個(gè)棧幀入棧,棧幀由以下幾部分組成:
5. PC Register:線程私有,保存當(dāng)前指令地址,執(zhí)行后指向下一條指令地址。
6. Native Method Stack:線程私有,存儲(chǔ)本地方法信息,C或C++棧。
執(zhí)行引擎
讀取、翻譯、執(zhí)行字節(jié)碼。JVM基于棧架構(gòu),這個(gè)棧就是操作數(shù)棧,字節(jié)碼指令就是通過(guò)它進(jìn)行各種運(yùn)算。此外還有基于寄存器的虛擬機(jī)。
本地方法接口和庫(kù)
JNI,調(diào)用本地方法,c/c++庫(kù);執(zhí)行引擎所需的本地方法庫(kù)。
小結(jié)
主流JVM的實(shí)現(xiàn)有Oracle的Hotspot JVM、JRockit以及IBM的JVM。說(shuō)到JVM調(diào)優(yōu),默認(rèn)指的就是Hotspot VM,足見(jiàn)其流行程度。如今搞Java不去了解JVM就顯得有點(diǎn)low了-v-。
要想寫出高質(zhì)量代碼,不僅要了解JVM,像調(diào)優(yōu),問(wèn)題排查等都需要完備的計(jì)算機(jī)基礎(chǔ)知識(shí),其實(shí)無(wú)論用什么語(yǔ)言開(kāi)發(fā),都是一個(gè)構(gòu)建和完善自身計(jì)算機(jī)知識(shí)體系的過(guò)程。
看完上述內(nèi)容,你們對(duì)深入淺析JVM的結(jié)構(gòu)體系有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
本文標(biāo)題:深入淺析JVM的結(jié)構(gòu)體系
文章網(wǎng)址:http://chinadenli.net/article14/jigdde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、Google、面包屑導(dǎo)航、網(wǎng)站排名、小程序開(kāi)發(fā)、響應(yīng)式網(wǎ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í)需注明來(lái)源: 創(chuàng)新互聯(lián)