新聞中心
JVM運(yùn)行原理是怎么樣的呢?

創(chuàng)新互聯(lián)公司主營(yíng)杭州網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP開發(fā)公司,杭州h5成都小程序開發(fā)搭建,杭州網(wǎng)站營(yíng)銷推廣歡迎杭州等地區(qū)企業(yè)咨詢
Java虛擬機(jī)(JVM,Java Virtual Machine)是一個(gè)抽象的計(jì)算機(jī),它為Java程序提供了一個(gè)平臺(tái),使得Java程序可以在不同的操作系統(tǒng)上運(yùn)行,JVM運(yùn)行原理主要包括類加載、字節(jié)碼執(zhí)行和垃圾回收三個(gè)部分,下面我們將詳細(xì)介紹這三部分的內(nèi)容。
類加載
1、1 類加載的概念
類加載是JVM將Java源代碼編譯成字節(jié)碼文件的過(guò)程,在Java程序中,當(dāng)我們使用關(guān)鍵字class或者new時(shí),JVM會(huì)自動(dòng)進(jìn)行類加載,類加載的主要目的是將類的字節(jié)碼文件加載到內(nèi)存中,以便后續(xù)的操作(如方法調(diào)用、字段訪問(wèn)等)。
1、2 類加載的三種方式
根據(jù)類加載的時(shí)機(jī)不同,可以將類加載分為三種方式:引導(dǎo)類加載、靜態(tài)類加載和動(dòng)態(tài)類加載。
(1)引導(dǎo)類加載(Bootstrap Class Loader):也稱為啟動(dòng)類加載器,是JVM啟動(dòng)時(shí)首先執(zhí)行的類加載器,引導(dǎo)類加載器負(fù)責(zé)加載Java核心庫(kù)中的類,如java.lang.*包中的類,引導(dǎo)類加載器可以手動(dòng)加載類,也可以通過(guò)Java命令行參數(shù)指定要加載的類。
(2)靜態(tài)類加載(Static Class Loader):也稱為擴(kuò)展類加載器,負(fù)責(zé)加載Java應(yīng)用程序的類,當(dāng)應(yīng)用程序啟動(dòng)時(shí),系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)名為APPClassLoader的類加載器,該類加載器負(fù)責(zé)加載應(yīng)用程序中的類,通常情況下,應(yīng)用程序不需要關(guān)心靜態(tài)類加載器的細(xì)節(jié)。
(3)動(dòng)態(tài)類加載(Dynamic Class Loader):也稱為子類加載器,負(fù)責(zé)在運(yùn)行時(shí)動(dòng)態(tài)加載類,當(dāng)我們使用Class.forName()方法或者ClassLoader.loadClass()方法加載類時(shí),實(shí)際上就是觸發(fā)了動(dòng)態(tài)類加載,動(dòng)態(tài)類加載的方式有很多,如URLClassLoader、FileClassLoader等。
字節(jié)碼執(zhí)行
2、1 字節(jié)碼的概念
字節(jié)碼(Bytecode)是一種介于機(jī)器碼和高級(jí)語(yǔ)言之間的中間代碼,在Java程序中,源代碼會(huì)被編譯成字節(jié)碼文件(.class文件),然后由JVM執(zhí)行,字節(jié)碼具有平臺(tái)無(wú)關(guān)性、高效性和安全性等特點(diǎn)。
2、2 Java字節(jié)碼的結(jié)構(gòu)
Java字節(jié)碼主要包括以下幾個(gè)部分:
操作數(shù)棧:用于存儲(chǔ)操作數(shù)的棧結(jié)構(gòu)。
操作數(shù)棧幀:每個(gè)操作數(shù)棧幀包含了局部變量表、操作數(shù)棧、常量池等信息。
堆棧:用于存儲(chǔ)方法返回值或局部變量的棧結(jié)構(gòu)。
常量池:存儲(chǔ)編譯時(shí)期生成的常量和符號(hào)引用。
指令集:包含了一系列的基本操作指令,如LOAD、STORE、ADD、SUB等。
異常處理塊:用于處理異常的方法入口和出口。
2、3 Java虛擬機(jī)規(guī)范(JVM Specification)
Java虛擬機(jī)規(guī)范定義了字節(jié)碼的結(jié)構(gòu)和指令集,以及各個(gè)組成部分之間的關(guān)系,在實(shí)際的JVM實(shí)現(xiàn)中,可能會(huì)有一些差異,但基本的架構(gòu)和規(guī)范是相同的。
垃圾回收
3、1 垃圾回收的概念
垃圾回收(Garbage Collection,GC)是JVM自動(dòng)管理內(nèi)存的一種機(jī)制,當(dāng)對(duì)象不再被引用時(shí),垃圾回收器會(huì)自動(dòng)回收這些無(wú)用的對(duì)象所占用的內(nèi)存空間,以便其他對(duì)象可以使用這部分內(nèi)存資源,這樣可以避免內(nèi)存泄漏和內(nèi)存溢出等問(wèn)題。
3、2 垃圾回收算法
目前主流的垃圾回收算法有以下幾種:
分代收集算法:將內(nèi)存劃分為新生代和老年代,新創(chuàng)建的對(duì)象分配在新生代,經(jīng)過(guò)多次回收仍然存活的對(duì)象會(huì)被提升到老年代,這種算法的優(yōu)點(diǎn)是可以減少全局回收的次數(shù),提高回收效率;缺點(diǎn)是可能導(dǎo)致內(nèi)存碎片化問(wèn)題,常見的分代收集算法有Serial、Parallel、CMS等。
標(biāo)記-清除算法:遍歷所有可達(dá)對(duì)象,并將其標(biāo)記為可達(dá)或不可達(dá);然后清除不可達(dá)對(duì)象所占用的內(nèi)存空間,這種算法的優(yōu)點(diǎn)是簡(jiǎn)單且高效;缺點(diǎn)是會(huì)產(chǎn)生內(nèi)存碎片化問(wèn)題。
復(fù)制算法:將內(nèi)存劃分為兩個(gè)相等的部分,每次只使用其中的一半;當(dāng)其中一部分被回收時(shí),將另一部分的內(nèi)容復(fù)制到已使用的那一半中,這種算法的優(yōu)點(diǎn)是對(duì)內(nèi)存布局沒(méi)有要求,適合處理浮動(dòng)垃圾回收問(wèn)題;缺點(diǎn)是可能導(dǎo)致內(nèi)存碎片化問(wèn)題和性能下降,常見的復(fù)制算法有Copying、Mark and Sweep等。
標(biāo)記-整理算法:先標(biāo)記所有可達(dá)對(duì)象,然后將所有存活的對(duì)象向一端移動(dòng),最后清除邊界以外的內(nèi)存空間,這種算法的優(yōu)點(diǎn)是對(duì)內(nèi)存布局沒(méi)有要求,適合處理浮動(dòng)垃圾回收問(wèn)題;缺點(diǎn)是可能導(dǎo)致內(nèi)存碎片化問(wèn)題和性能下降,常見的標(biāo)記-整理算法有Compacting等。
分享題目:JVM運(yùn)行原理是怎么樣的呢
網(wǎng)站鏈接:http://www.dlmjj.cn/article/ccehsdd.html


咨詢
建站咨詢
