jvm是java virtual machine的英文縮寫,中文名:java虛擬機(jī)。它的作用是java程序(.class文件)和硬件系統(tǒng)的接口,也就是將.class文件字節(jié)碼解釋成CPU可調(diào)用計(jì)算機(jī)指令,以此保證了java程序平臺(tái)無關(guān)性。jvm它主要由類加載器(Class Loader)、執(zhí)行引擎(Excution Engine)及java數(shù)據(jù)區(qū)(Runtime Data Area)三部分組成,引用一張官方圖如下:
一)類加載器(Class loader)主要作用是將.class文件加載到運(yùn)行時(shí)數(shù)據(jù)區(qū)(Runtime Data Area)。
Java類的加載分為兩種方式:
1)隱式加載,所有通過new生成的類對(duì)象實(shí)例;
2)顯式加載,Class.formName()動(dòng)態(tài)加載;
Java類的加載過程可以分為五步:
1)載入,讀入.class文件,創(chuàng)建class對(duì)象;
2)驗(yàn)證,檢驗(yàn).class文件字節(jié)流里信息符合當(dāng)前vm的基本要求(比如版本)、安全性(檢驗(yàn)字節(jié)流不會(huì)損害vm)
3)分配類對(duì)像的內(nèi)存,對(duì)基本類型數(shù)據(jù)分配Stack,并對(duì)final和staic類型的變量初始化0;
4)解析類,包括類字段、類方法、類接口;
5)初始化,執(zhí)行超類初始化,以及類里靜態(tài)變量、靜態(tài)方法、字段默認(rèn)值初始化。
二)運(yùn)行數(shù)據(jù)區(qū)域,運(yùn)行數(shù)據(jù)區(qū)域主要由PC計(jì)數(shù)器、方法區(qū)域、堆內(nèi)存、Java虛擬機(jī)棧和本地方法棧,引用如下圖:
1)PC計(jì)數(shù)器是一塊較小內(nèi)存,屬于線程私有,可以看作是當(dāng)前線程執(zhí)行的字節(jié)碼行號(hào)指示器;在java多線程中,每個(gè)線程都有一個(gè)PC,以便完成不同線程的上下文環(huán)境切換;
2)Java虛擬機(jī)棧,和PC計(jì)數(shù)器一樣,屬于線程私用,記錄線程的局部變量、操作數(shù)棧;
3)本地方法棧和Java虛擬機(jī)棧相似,Java虛擬機(jī)棧是為虛擬機(jī)方法服務(wù),本地方法棧則是為本地方法服務(wù);
4)堆內(nèi)存是線程公共內(nèi)存,在jvm啟動(dòng)時(shí)創(chuàng)建,用于存放所有實(shí)例對(duì)像和數(shù)組值;
5)方法區(qū)域,也和堆內(nèi)存一樣,是所有線程公共區(qū)域,記錄了類的常量、成員變量、方法數(shù)據(jù)
三)執(zhí)行引擎由JIT編譯器和垃圾回收器GC組成。垃圾回收器是一個(gè)優(yōu)先級(jí)較低的守護(hù)線程,該線程的運(yùn)行優(yōu)先級(jí)會(huì)隨著內(nèi)存消耗不斷提高。垃圾回收器只會(huì)收集通過new出來對(duì)像,它采用的策略是根據(jù)對(duì)像最近被使用的時(shí)間作為依據(jù)對(duì)對(duì)像實(shí)例進(jìn)行分代,對(duì)不同分代采用不同策略。JVM中對(duì)象引用分為四種類型:1)強(qiáng)引用(比如new一個(gè)實(shí)例),默認(rèn)情況下,對(duì)像引用都采用強(qiáng)引用;2)軟引用,內(nèi)存不足時(shí)會(huì)被回收,多數(shù)情況在本地緩存時(shí)會(huì)用到軟引用;3)弱引用,一定會(huì)被回收;4)虛引用,一定會(huì)被回收。
來源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問題,請(qǐng)聯(lián)系我們及時(shí)刪除。