Java源文件的编译、下载、解释和执行
生活随笔
收集整理的這篇文章主要介紹了
Java源文件的编译、下载、解释和执行
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、Java源文件的編譯、下載、解釋和執(zhí)行
1. 執(zhí)行java程序的步驟:
Java源文件(程序員編寫的*.java文件),使用javac編譯生成*.class文件(字節(jié)碼文件),然后使用java解釋執(zhí)行生成特定平臺(tái)的機(jī)器碼。2.java解釋執(zhí)行過(guò)程分為代碼的裝入、代碼的校驗(yàn)、代碼的執(zhí)行
2.1 代碼的裝入:由類加載器(class loader)完成。
類加載器負(fù)責(zé)加載運(yùn)行一個(gè)程序所需要的所有代碼,包括繼承的類和被其調(diào)用的類。該類被放在自己的名字空間里,除了通過(guò)符號(hào)引用自己名字空間以外的類,類之間是沒(méi)有辦法可以相互影響。在本機(jī)上的所有類都在同一地址空間內(nèi),所有從外部引進(jìn)來(lái)的類都有一個(gè)自己獨(dú)立的名字空間。這使得本地類可通過(guò)共享相同的名字空間而獲得較高的運(yùn)行效率,同時(shí)又保證它們與從外部引進(jìn)類不會(huì)相互影響。當(dāng)裝入了運(yùn)行程序需要的所有類后,解釋器便可確定整個(gè)可執(zhí)行程序的內(nèi)存布局。解釋器為符號(hào)引用而同特定的地址空間建立對(duì)應(yīng)關(guān)系及查詢表。通過(guò)在這一階段確定代碼的內(nèi)存布局,Java很好地解決了由超類(父類)改變而使子類崩潰的問(wèn)題,同時(shí)也防止了代碼對(duì)地址的非法訪問(wèn)。2.2 代碼的校驗(yàn):校驗(yàn)器可發(fā)現(xiàn)操作數(shù)棧溢出,非法數(shù)據(jù)類型轉(zhuǎn)化等多種錯(cuò)誤。通過(guò)了校驗(yàn)后,代碼便可開始執(zhí)行了。
2.3 代碼的執(zhí)行:即時(shí)編譯、解釋執(zhí)行兩種方式
即時(shí)編譯:解釋器先將字節(jié)碼編譯成機(jī)器碼,然后再執(zhí)行該機(jī)器碼。解釋執(zhí)行:解釋器通過(guò)每次解釋并執(zhí)行一小段代碼來(lái)完成java字節(jié)碼的所有操作。由于JVM規(guī)格描述具有足夠的靈活性,這使得將字節(jié)碼翻譯為機(jī)器碼的工作具有較高的效率。對(duì)于運(yùn)行速度要求較高的應(yīng)用程序,解釋器可將java字節(jié)碼即時(shí)編譯為機(jī)器碼,從而保證了java代碼的可移植性和高性能。二、JVM規(guī)格描述
JVM定義了,控制Java代碼解釋執(zhí)行和具體實(shí)現(xiàn)的五種規(guī)格,它們是: JVM指令系統(tǒng),JVM寄存器,JVM棧結(jié)構(gòu),JVM碎片回收堆,JVM存儲(chǔ)區(qū)。
1. JVM指令系統(tǒng):
2.JVM寄存器:
寄存器是內(nèi)存的最頂端,也是系統(tǒng)獲取操作資料的最快途徑。它是中央處理器的組成部分,是存儲(chǔ)容量有限高速存儲(chǔ)部件。寄存器可用來(lái)暫存指令、數(shù)據(jù)和地址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計(jì)數(shù)器(PC)。在中央處理器的算術(shù)及邏輯部件中,存器有累加器(ACC)。寄存器的基本單元是 D觸發(fā)器,按照其用途分為基本寄存器和移位寄存器。基本寄存器是由 D觸發(fā)器組成,在 CP 脈沖作用下,每個(gè) D觸發(fā)器能夠寄存一位二進(jìn)制碼。在 D=0 時(shí),寄存器儲(chǔ)存為 0,在 D=1 時(shí),寄存器儲(chǔ)存為 1。 寄存器的功能十分重要,CPU對(duì)存儲(chǔ)器中的數(shù)據(jù)進(jìn)行處理時(shí),往往先把數(shù)據(jù)取到內(nèi)部寄存器中,而后再作處理。外部寄存器是計(jì)算機(jī)中其它一些部件上用于暫存數(shù)據(jù)的寄存器,它與CPU之間通過(guò)"端口"交換數(shù)據(jù),外部寄存器具有寄存器和內(nèi)存儲(chǔ)器雙重特點(diǎn)。有些時(shí)候我們常把外部寄存器就稱為"端口",這種說(shuō)法不太嚴(yán)格,但經(jīng)常這樣說(shuō)。外部寄存器雖然也用于存放數(shù)據(jù),但是它保存的數(shù)據(jù)具有特殊的用途。某些寄存器中各個(gè)位的0、1狀態(tài)反映了外部設(shè)備的工作狀態(tài)或方式;還有一些寄存器中的各個(gè)位可對(duì)外部設(shè)備進(jìn)行控制;也有一些端口作為CPU同外部設(shè)備交換數(shù)據(jù)的通路。所以說(shuō),端口是CPU和外設(shè)間的聯(lián)系橋梁。CPU對(duì)端口的訪問(wèn)也是依據(jù)端口的"編號(hào)"(地址),這一點(diǎn)又和訪問(wèn)存儲(chǔ)器一樣。不過(guò)考慮到機(jī)器所聯(lián)接的外設(shè)數(shù)量并不多,所以在設(shè)計(jì)機(jī)器的時(shí)候僅安排了1024個(gè)端口地址,端口地址范圍為0--3FFH。JVM只設(shè)置了4個(gè)最為常用的寄存器。它們是:
pc程序計(jì)數(shù)器, optop操作數(shù)棧頂指針 frame當(dāng)前執(zhí)行環(huán)境指針 vars指向當(dāng)前執(zhí)行環(huán)境中第一個(gè)局部變量的指針 所有寄存器均為32位。pc用于記錄程序的執(zhí)行。optop,frame和vars用于記錄指向Java棧區(qū)的指針。3. JVM棧結(jié)構(gòu)
作為基于棧結(jié)構(gòu)的計(jì)算機(jī),Java棧是JVM存儲(chǔ)信息的主要方法。當(dāng)JVM得到一個(gè)java字節(jié)碼應(yīng)用程序后,便為該代碼中一個(gè)類的每一個(gè)方法創(chuàng)一個(gè)棧框架,用來(lái)保存該方法的狀態(tài)信息。每個(gè)棧框架包括以下三類信息:局部變量執(zhí)行環(huán)境操作數(shù)棧 局部變量:用于存儲(chǔ)一個(gè)類的方法中所用到的局部變量。Vars寄存器指向該變量表中的第一個(gè)局部變量。執(zhí)行環(huán)境:它是執(zhí)行一個(gè)方法的控制中心,用于保存解釋器對(duì)java字節(jié)碼進(jìn)行解釋過(guò)程中所需要的信息(它們是:上次調(diào)用的方法、局部變量指針、操作數(shù)棧的棧頂指針和棧底指針)。4. JVM碎片回收堆
Java類的實(shí)例所需的存儲(chǔ)空間是在堆上分配的。解釋器承擔(dān)著為實(shí)例分配空間的工作。解釋器為一個(gè)實(shí)例分配完空間后,便開始記錄該實(shí)例對(duì)所占內(nèi)存的使用情況,一旦使用完畢,便將其回收到堆中。5. JVM存儲(chǔ)區(qū):常量緩沖池、方法區(qū)
常量緩沖池:用于存儲(chǔ)類名稱、方法、字段名及串常量。 方法區(qū):用于存儲(chǔ)java方法的字節(jié)碼。總結(jié)
以上是生活随笔為你收集整理的Java源文件的编译、下载、解释和执行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 多线程情况下创建连接池
- 下一篇: Java如何使用Listener