Java基礎(chǔ)(七)-JVM-1

  • 問 JVM包含哪幾部分项鬼?
    JVM 主要由四大部分組成:ClassLoader(類加載器)粱栖,Runtime Data Area(運(yùn)行時(shí)數(shù)據(jù)區(qū),內(nèi)存分區(qū)),Execution Engine(執(zhí)行引擎)斜姥,Native Interface(本地庫接口)匈辱,下圖可以大致描述JVM的結(jié)構(gòu)


    JVM的結(jié)構(gòu)

    JVM是執(zhí)行Java程序的虛擬計(jì)算機(jī)系統(tǒng)部翘,執(zhí)行過程: 首先需要準(zhǔn)備好編譯好的Java字節(jié)碼文件(即class文件)河闰,計(jì)算機(jī)要運(yùn)行程序需要先通過一定方式(類加載器)將class文件加載到內(nèi)存中(運(yùn)行時(shí)數(shù)據(jù)區(qū)),但是字節(jié)碼文件是JVM定義的一套指令集規(guī)范锨匆,并不能直接交給底層操作系統(tǒng)去執(zhí)行崭别,因此需要特定的命令解釋器(執(zhí)行引擎)將字節(jié)碼翻譯成特定的操作系統(tǒng)指令集交給CPU去執(zhí)行,這個(gè)過程中需要調(diào)用一些不同語言為Java提供的接口(例如驅(qū)動(dòng)恐锣,地圖制作等)茅主,這就用到了本地native接口(本地庫接口)
    ClassLoader:負(fù)責(zé)加載字節(jié)碼文件即class文件,class文件在文件開頭有特定的文件標(biāo)示土榴,并且ClassLoader只負(fù)責(zé)class文件的加載诀姚,至于是否可以運(yùn)行,則由Execution Engine決定
    Runtime Data Area:是存放數(shù)據(jù)的玷禽,分為五部分:Stack(虛擬機(jī)棧)赫段,Heap(堆),Method Area(方法區(qū))矢赁,PC Register(程序計(jì)數(shù)器)糯笙,Native Method Stack(本地方法棧)。幾乎所有的關(guān)于Java內(nèi)存方面的問題坯台,都集中在這塊炬丸。
    Execution Engine:執(zhí)行引擎,也叫 Interpreter蜒蕾。Class文件被加載后,會(huì)把指令和數(shù)據(jù)信息放入內(nèi)存中焕阿,Execution Engine則負(fù)責(zé)把這些命令解釋給操作系統(tǒng)咪啡,即將JVM指令集翻譯為操作系統(tǒng)的指令集。
    Native Interface:負(fù)責(zé)調(diào)用本地接口的暮屡,他的作用是調(diào)用不同語言的接口給Java用撤摸,他會(huì)在Native Method Stack中記錄對(duì)應(yīng)的本地方法,然后調(diào)用該方法時(shí)就通過Execution Engine加載對(duì)應(yīng)的本地lib褒纲。原本多用于一些專業(yè)領(lǐng)域准夷,如Java驅(qū)動(dòng),地圖制作引擎等莺掠,現(xiàn)在關(guān)于這種本地方法接口的調(diào)用已經(jīng)被類似于Socket通信衫嵌,WebService等方式取代。

  • JVM的啟動(dòng)過程分為如下四個(gè)步驟:

  1. JVM的裝入環(huán)境和配置
    java.exe 負(fù)責(zé)查找JRE,并且它會(huì)按照如下的順序來選擇JRE
    自己目錄下的JRE
    父級(jí)目錄下的JRE
    查注冊(cè)中注冊(cè)的JRE
  2. 裝載JVM
    通過第一步找到JVM的路徑后彻秆,Java.exe通過LoadJavaVM來裝入JVM文件楔绞。LoadLibrary裝載JVM動(dòng)態(tài)連接庫结闸,然后把JVM中的到處函數(shù)JNI_CreateJavaVM和JNI_GetDefaultJavaVMIntArgs掛接到InvocationFunction變量的CreateJavaVM和GetDefaultJavaVMInitArgs函數(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方法裝載該類图甜。
  • Java程序是怎么運(yùn)行的?
    寫好的Java源代碼經(jīng)過Java編譯器編譯成字節(jié)碼文件后慰枕,通過類加載器加載到內(nèi)存中具则,才能被實(shí)例化,然后Java虛擬機(jī)中解釋執(zhí)行后具帮,最后通過操作系統(tǒng)操作CPU執(zhí)行獲取結(jié)果博肋,如下圖


    Java運(yùn)行過程
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜂厅,隨后出現(xiàn)的幾起案子匪凡,更是在濱河造成了極大的恐慌,老刑警劉巖掘猿,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件病游,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡稠通,警方通過查閱死者的電腦和手機(jī)衬衬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來改橘,“玉大人滋尉,你說我怎么就攤上這事》芍鳎” “怎么了狮惜?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)碌识。 經(jīng)常有香客問我碾篡,道長(zhǎng),這世上最難降的妖魔是什么筏餐? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮胖烛,結(jié)果婚禮上眼姐,老公的妹妹穿的比我還像新娘诅迷。我一直安慰自己,他們只是感情好众旗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布罢杉。 她就那樣靜靜地躺著,像睡著了一般贡歧。 火紅的嫁衣襯著肌膚如雪滩租。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天利朵,我揣著相機(jī)與錄音律想,去河邊找鬼。 笑死绍弟,一個(gè)胖子當(dāng)著我的面吹牛技即,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播樟遣,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼而叼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了豹悬?” 一聲冷哼從身側(cè)響起葵陵,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞻佛,沒想到半個(gè)月后脱篙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伤柄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年绊困,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片适刀。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡考抄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔗彤,到底是詐尸還是另有隱情,我是刑警寧澤疯兼,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布然遏,位于F島的核電站,受9級(jí)特大地震影響吧彪,放射性物質(zhì)發(fā)生泄漏待侵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一姨裸、第九天 我趴在偏房一處隱蔽的房頂上張望秧倾。 院中可真熱鬧怨酝,春花似錦、人聲如沸那先。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽售淡。三九已至斤葱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揖闸,已是汗流浹背揍堕。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汤纸,地道東北人衩茸。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贮泞,于是被迫代替她去往敵國(guó)和親楞慈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容