要精通Java哆料,先研究它的執(zhí)行原理

對(duì)于任何一門語言炬称,要想達(dá)到精通的水平,研究它的執(zhí)行原理(或者叫底層機(jī)制)不失為一種良好的方式。

在本篇文章中,將重點(diǎn)研究java源代碼的執(zhí)行原理,即從程序員編寫JAVA源代碼待错,到最終形成產(chǎn)品,在整個(gè)過程中烈评,都經(jīng)歷了什么火俄?每一步又是怎么執(zhí)行的?執(zhí)行原理又是什么讲冠?

在這里小編建了一個(gè)前端學(xué)習(xí)交流扣扣群:1093794329瓜客,我自己整理的最新的前端資料和高級(jí)開發(fā)教程,如果有想需要的竿开,可以加群一起學(xué)習(xí)交流

一谱仪、編寫java源程序

java源文件:指存儲(chǔ)java源碼的文件。

先來看看如下代碼:

//MyTest被public修飾否彩,故存儲(chǔ)該java源碼的文件名為MyTest

publicclassMyTest{

publicstaticvoidmain(String[] args){

System.out.println("Test Java execute process.");

}

}

//由于MyTest被public修飾了疯攒,故Class A不能用public修飾

classA{}

//由于MyTest被public修飾了,故Class B不能用public修飾

classB{}

1列荔、java源文件名就是該源文件中public類的名稱

2敬尺、一個(gè)java源文件可以包含多個(gè)類,但只允許一個(gè)類為public

二贴浙、編譯java源代碼

當(dāng)java源程序編碼結(jié)束后砂吞,就需要編譯器編譯。

安裝好jdk后崎溃,我們打開jdk目錄蜻直,有兩個(gè).exe文件,即javac.exe(編譯源代碼笨奠,xxx.java文件) 和 java.exe(執(zhí)行字節(jié)碼袭蝗,xxx.class文件).

如下圖所示:

1唤殴、切換到MyTest.java文件夾

2般婆、javac.exe編譯MyTest.java

編譯后,發(fā)現(xiàn)e:\Blogs 目錄多了以class為后綴的文件:A.class,B.class和MyTest.class

Tip:當(dāng)javac.exe編譯java源代碼時(shí)朵逝,java源代碼有幾個(gè)類蔚袍,就會(huì)編譯成一個(gè)對(duì)應(yīng)的字節(jié)碼文件(.class文件)

其中,字節(jié)碼文件的文件名就是每個(gè)類的類名。需要注意的是啤咽,類即使不在源文件中定義晋辆,但被源文件引用,編譯后宇整,也會(huì)編程相應(yīng)的字節(jié)碼文件瓶佳。

如類A引用類C,但類C不定義在類A的源文件中鳞青,編譯后霸饲,類C也被編譯成對(duì)應(yīng)的字節(jié)碼文件C.class

Tips:關(guān)注微信公眾號(hào):Java后端,每日獲取技術(shù)博文推送臂拓。

三厚脉、執(zhí)行java源文件

執(zhí)行java源文件,用java.exe執(zhí)行即可

到現(xiàn)在胶惰,java源程序基本執(zhí)行結(jié)果傻工,并正確打印我們期望的結(jié)果,那么孵滞,如上的步驟中捆,我們可以總結(jié)如下:

如上總結(jié),已經(jīng)抽象化了在JVM中的執(zhí)行坊饶。接下來轨香,我們將分析字節(jié)碼文件(.class文件)如何在虛擬機(jī)中一步一執(zhí)行的。

四幼东、JVM如何執(zhí)行字節(jié)碼文件

1臂容、裝載字節(jié)碼文件

當(dāng) .java 源碼被 javac.exe 編譯器編譯成 .class 字節(jié)碼文件后,接下來的工作就交給JVM處理根蟹。

JVM首先通過類加載器(ClassLoader)脓杉,將class文件和相關(guān)Java API加載裝入JVM,以供JVM后續(xù)處理简逮。

在該階段中球散,涉及到如下一些基本概念和知識(shí)。

1)JDK,JRE和JVM關(guān)系

JDK(Java Development Kit)散庶,Java開發(fā)工具包蕉堰,主要用于開發(fā),在JDK7前悲龟,JDK包括JRE

JRE(Java Runtime Environment)屋讶,Java程序運(yùn)行的核心環(huán)境,包括JVM和一些核心庫

JVM(Java Virtual Machine)须教,VM是一種用于計(jì)算設(shè)備的規(guī)范皿渗,它是一個(gè)虛構(gòu)出來的計(jì)算機(jī)斩芭,是通過在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來實(shí)現(xiàn)的,是JRE核心模塊乐疆。

2)JVM

JVM是一種用于計(jì)算設(shè)備的規(guī)范划乖,它是一個(gè)虛構(gòu)出來的計(jì)算機(jī),是通過在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來實(shí)現(xiàn)的挤土。

Java虛擬機(jī)的主要任務(wù)是裝載class文件琴庵,并執(zhí)行其中的字節(jié)碼,不同的Java虛擬機(jī)中仰美,執(zhí)行引擎可能有不同的實(shí)現(xiàn)细卧。

大致有如下幾種引擎:

一次性解釋字節(jié)碼引擎

即時(shí)編譯引擎

自適應(yīng)優(yōu)化器

關(guān)于虛擬機(jī)的實(shí)現(xiàn)方式,采用軟件方式筒占、硬件方式和軟件硬件結(jié)合方式贪庙,這個(gè)要根據(jù)具體廠商而定。

3)什么是ClassLoader

虛擬機(jī)的主要任務(wù)是裝載class文件并執(zhí)行其中的字節(jié)碼翰苫,而class文件是由虛擬機(jī)的類加載器(ClassLoader)完成的止邮,在一個(gè)Java虛擬機(jī)中有可能存在多個(gè)類加載器。

任何java運(yùn)用程序奏窑,可能會(huì)使用兩種類加載器导披,即啟動(dòng)類加載器(bootstrap)和用戶自定義類加載器。

啟動(dòng)類加載器是Java虛擬機(jī)唯一實(shí)現(xiàn)的一部分埃唯,它又可分為原始類裝載器撩匕,系統(tǒng)類裝載器或默認(rèn)類裝載器。它的主要作用是從操作系統(tǒng)的磁盤裝載相應(yīng)的類墨叛,如Java API類等止毕。

用戶自定義裝載類,即按照用戶自定義的方式來裝載類扁凛。

2、將字節(jié)碼文件存儲(chǔ)在JVM內(nèi)存區(qū)

當(dāng)JAVA虛擬機(jī)運(yùn)行一個(gè)程序時(shí)谨朝,它需要內(nèi)存來存儲(chǔ)許多東西。

比如如字節(jié)碼字币,程序創(chuàng)建的對(duì)象,傳遞給方法的參數(shù)洗出,返回值,局部變量以及運(yùn)算的中間結(jié)果等骄呼,這些相關(guān)信息被組織到“運(yùn)行時(shí)數(shù)據(jù)區(qū)”共苛。

根據(jù)廠商的不同,在Java虛擬機(jī)中蜓萄,運(yùn)行時(shí)數(shù)據(jù)區(qū)也有所不同隅茎。有些運(yùn)行時(shí)數(shù)據(jù)區(qū)由線程共享,有些只能由某個(gè)特定線程共享嫉沽。

運(yùn)行時(shí)數(shù)據(jù)區(qū)大致可分幾個(gè)區(qū):方法區(qū)辟犀,堆區(qū),棧區(qū)绸硕,PC寄存器區(qū)和本地方法棧區(qū)堂竟。

在該階段中,涉及到如下基本概念和知識(shí)玻佩。

1)方法區(qū)

方法區(qū)用來存儲(chǔ)解析被加載的class文件的相關(guān)信息出嘹。

當(dāng)虛擬裝載一個(gè)class文件后,它會(huì)從這個(gè)class文件包含的二進(jìn)制數(shù)據(jù)中解析類型信息咬崔,然后將該相關(guān)信息存儲(chǔ)到方法區(qū)中税稼。

2)堆

堆是用來存儲(chǔ)相關(guān)引用類型的,如new對(duì)象垮斯。當(dāng)程序運(yùn)行時(shí)郎仆,虛擬機(jī)會(huì)把所有該程序在運(yùn)行時(shí)創(chuàng)建的對(duì)象都放到堆中。

3)PC寄存器

PC寄存器主要用來存儲(chǔ)線程兜蠕。當(dāng)新創(chuàng)建一個(gè)線程時(shí)扰肌,該線程都將得到一個(gè)自己的PC寄存器(程序計(jì)數(shù)器)以及一個(gè)java棧。

Java虛擬機(jī)沒有寄存器熊杨,其指令集使用Java棧來存儲(chǔ)中間數(shù)據(jù)曙旭。

4)棧區(qū)

棧區(qū)主要用來存儲(chǔ)值類型的,如基本數(shù)據(jù)類型晶府。需要注意的是夷狰,String為引用類型,是存在堆中的郊霎。

Java棧是由許多棧幀組成的沼头,一個(gè)棧幀包含一個(gè)Java方法調(diào)用的狀態(tài),當(dāng)線程調(diào)用一個(gè)方法時(shí)书劝,虛擬機(jī)壓入一個(gè)新的棧幀到該線程的Java棧中进倍,當(dāng)該方法返回時(shí),這個(gè)棧幀從Java棧中彈出购对。

3猾昆、執(zhí)行引擎與運(yùn)行時(shí)數(shù)據(jù)區(qū)交互

運(yùn)行時(shí)數(shù)據(jù)區(qū)為執(zhí)行引擎提供了執(zhí)行環(huán)境和相關(guān)數(shù)據(jù),執(zhí)行引擎通過與運(yùn)行時(shí)數(shù)據(jù)區(qū)交互骡苞,從而獲取執(zhí)行時(shí)需要的相關(guān)信息,存儲(chǔ)執(zhí)行的中間結(jié)果等

4烘苹、執(zhí)行引擎與本地方法接口

當(dāng)要執(zhí)行本地方法時(shí)片部,執(zhí)行引擎將調(diào)用本地方法接口來獲取相關(guān)OS本地方法档悠。

需要注意的是,本地方法與操作系統(tǒng)強(qiáng)耦合的惰说。

5缘回、JVM在具體操作系統(tǒng)上執(zhí)行

JVM通過調(diào)用本地接口來獲取本地方法,從而實(shí)現(xiàn)在具體的平臺(tái)上執(zhí)行切诀。比如在Linux系統(tǒng)上執(zhí)行幅虑,在Window系統(tǒng)上執(zhí)行和在Unix系統(tǒng)上執(zhí)行。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市擎宝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌噩咪,老刑警劉巖胃碾,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仆百,死亡現(xiàn)場離奇詭異奔脐,居然都是意外死亡吁讨,警方通過查閱死者的電腦和手機(jī)建丧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門茶鹃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艰亮,“玉大人迄埃,你說我怎么就攤上這事侄非×饕耄” “怎么了福澡?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵革砸,是天一觀的道長。 經(jīng)常有香客問我册踩,道長暂吉,這世上最難降的妖魔是什么借笙? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任业稼,我火速辦了婚禮蚂蕴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熔号。我一直安慰自己,他們只是感情好朦蕴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布吩抓。 她就那樣靜靜地躺著赴恨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雨饺。 梳的紋絲不亂的頭發(fā)上额港,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天移斩,我揣著相機(jī)與錄音叹哭,去河邊找鬼痕貌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛超升,可吹牛的內(nèi)容都是我干的室琢。 我是一名探鬼主播落追,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼巢钓,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼症汹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咬展,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤破婆,失蹤者是張志新(化名)和其女友劉穎荠割,沒想到半個(gè)月后旺矾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箕宙,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柬帕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了其馏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仔引,死狀恐怖褐奥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情儿倒,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布呜笑,位于F島的核電站夫否,受9級(jí)特大地震影響找筝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜慷吊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一袖裕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溉瓶,春花似錦急鳄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至触创,卻和暖如春坎藐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寸谜。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓愁拭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親许赃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子句喜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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