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