Java的執(zhí)行原理是什么-創(chuàng)新互聯(lián)

這篇文章主要講解了“Java的執(zhí)行原理是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java的執(zhí)行原理是什么”吧!

成都創(chuàng)新互聯(lián)公司是一家專(zhuān)注于網(wǎng)站建設(shè)、成都網(wǎng)站制作與策劃設(shè)計(jì),坪山網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:坪山等地區(qū)。坪山做網(wǎng)站價(jià)格咨詢(xún):18980820575

一、編寫(xiě)java源程序

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

先來(lái)看看如下代碼:

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

public class MyTest {

public static void main(String[] args){

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

}

}

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

class A{}

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

class B{}

1、java源文件名就是該源文件中public類(lèi)的名稱(chēng)

Java的執(zhí)行原理是什么

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

二、編譯java源代碼

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

安裝好jdk后,我們打開(kāi)jdk目錄,有兩個(gè).exe文件,即javac.exe(編譯源代碼,xxx.java文件) 和 java.exe(執(zhí)行字節(jié)碼,xxx.class文件).

如下圖所示:

Java的執(zhí)行原理是什么

1、切換到MyTest.java文件夾

Java的執(zhí)行原理是什么

2、javac.exe編譯MyTest.java

Java的執(zhí)行原理是什么

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

Java的執(zhí)行原理是什么

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

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

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

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

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

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

Java的執(zhí)行原理是什么

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

Java的執(zhí)行原理是什么

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

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

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

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

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

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

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

  • JDK(Java Development Kit),Java開(kāi)發(fā)工具包,主要用于開(kāi)發(fā),在JDK7前,JDK包括JRE

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

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

2)JVM

JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(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ī)的類(lèi)加載器(ClassLoader)完成的,在一個(gè)Java虛擬機(jī)中有可能存在多個(gè)類(lèi)加載器。

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

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

用戶(hù)自定義裝載類(lèi),即按照用戶(hù)自定義的方式來(lái)裝載類(lèi)。

Java的執(zhí)行原理是什么

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

當(dāng)JAVA虛擬機(jī)運(yùn)行一個(gè)程序時(shí),它需要內(nèi)存來(lá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ū)用來(lái)存儲(chǔ)解析被加載的class文件的相關(guān)信息。

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

2)堆

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

3)PC寄存器

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

Java虛擬機(jī)沒(méi)有寄存器,其指令集使用Java棧來(lái)存儲(chǔ)中間數(shù)據(jù)。

4)棧區(qū)

棧區(qū)主要用來(lái)存儲(chǔ)值類(lèi)型的,如基本數(shù)據(jù)類(lèi)型。需要注意的是,String為引用類(lèi)型,是存在堆中的。

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

Java的執(zhí)行原理是什么

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

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

Java的執(zhí)行原理是什么

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

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

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

Java的執(zhí)行原理是什么

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

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

Java的執(zhí)行原理是什么

感謝各位的閱讀,以上就是“Java的執(zhí)行原理是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java的執(zhí)行原理是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

文章題目:Java的執(zhí)行原理是什么-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://muchs.cn/article32/dhghpc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)、網(wǎng)站導(dǎo)航、手機(jī)網(wǎng)站建設(shè)、電子商務(wù)、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化