一、編寫Java源程序
為華陰等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及華陰網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、華陰網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!二、編譯Java源代碼
三、執(zhí)行Java源文件
四、JVM如何執(zhí)行字節(jié)碼文件
對于任何一門語言,要想達(dá)到精通的水平,研究它的執(zhí)行原理(或者叫底層機(jī)制)不失為一種良好的方式。
在本篇文章中,將重點(diǎn)研究java源代碼的執(zhí)行原理,即從程序員編寫JAVA源代碼,到最終形成產(chǎn)品,在整個(gè)過程中,都經(jīng)歷了什么?每一步又是怎么執(zhí)行的?執(zhí)行原理又是什么?
一 編寫java源程序
java源文件:指存儲java源碼的文件。
先來看看如下代碼:
//MyTest被public修飾,故存儲該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類的名稱
(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è)類,就會編譯成一個(gè)對應(yīng)的字節(jié)碼文件(.class文件)
其中,字節(jié)碼文件的文件名就是每個(gè)類的類名。需要注意的是,類即使不在源文件中定義,但被源文件引用,編譯后,也會編程相應(yīng)的字節(jié)碼文件。
如類A引用類C,但類C不定義在類A的源文件中,編譯后,類C也被編譯成對應(yīng)的字節(jié)碼文件C.class
三 執(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é)碼文件
(一)裝載字節(jié)碼文件
當(dāng) .java 源碼被 javac.exe 編譯器編譯成 .class 字節(jié)碼文件后,接下來的工作就交給JVM處理。
JVM首先通過類加載器(ClassLoader),將class文件和相關(guān)Java API加載裝入JVM,以供JVM后續(xù)處理。
在該階段中,涉及到如下一些基本概念和知識。
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)用程序,可能會使用兩種類加載器,即啟動(dòng)類加載器(bootstrap)和用戶自定義類加載器。
啟動(dòng)類加載器是Java虛擬機(jī)唯一實(shí)現(xiàn)的一部分,它又可分為原始類裝載器,系統(tǒng)類裝載器或默認(rèn)類裝載器。它的主要作用是從操作系統(tǒng)的磁盤裝載相應(yīng)的類,如Java API類等。
用戶自定義裝載類,即按照用戶自定義的方式來裝載類。
(二)將字節(jié)碼文件存儲在JVM內(nèi)存區(qū)
當(dāng)JAVA虛擬機(jī)運(yùn)行一個(gè)程序時(shí),它需要內(nèi)存來存儲許多東西。
比如如字節(jié)碼,程序創(chuàng)建的對象,傳遞給方法的參數(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ū)。
在該階段中,涉及到如下基本概念和知識。
1、方法區(qū)
方法區(qū)用來存儲解析被加載的class文件的相關(guān)信息。
當(dāng)虛擬裝載一個(gè)class文件后,它會從這個(gè)class文件包含的二進(jìn)制數(shù)據(jù)中解析類型信息,然后將該相關(guān)信息存儲到方法區(qū)中。
2.堆
堆是用來存儲相關(guān)引用類型的,如new對象。當(dāng)程序運(yùn)行時(shí),虛擬機(jī)會把所有該程序在運(yùn)行時(shí)創(chuàng)建的對象都放到堆中。
3.PC寄存器
PC寄存器主要用來存儲線程。當(dāng)新創(chuàng)建一個(gè)線程時(shí),該線程都將得到一個(gè)自己的PC寄存器(程序計(jì)數(shù)器)以及一個(gè)java棧。
Java虛擬機(jī)沒有寄存器,其指令集使用Java棧來存儲中間數(shù)據(jù)。
4.棧區(qū)
棧區(qū)主要用來存儲值類型的,如基本數(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棧中彈出。
(三)執(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)信息,存儲執(zhí)行的中間結(jié)果等
(四)執(zhí)行引擎與本地方法接口
當(dāng)要執(zhí)行本地方法時(shí),執(zhí)行引擎將調(diào)用本地方法接口來獲取相關(guān)OS本地方法。
需要注意的是,本地方法與操作系統(tǒng)強(qiáng)耦合的。
(五)JVM在具體操作系統(tǒng)上執(zhí)行
JVM通過調(diào)用本地接口來獲取本地方法,從而實(shí)現(xiàn)在具體的平臺上執(zhí)行。比如在Linux系統(tǒng)上執(zhí)行,在Window系統(tǒng)上執(zhí)行和在Unix系統(tǒng)上執(zhí)行。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
新聞標(biāo)題:你寫的Java代碼是如何一步步輸出結(jié)果的?-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://muchs.cn/article16/pipdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、微信小程序、搜索引擎優(yōu)化、網(wǎng)站維護(hù)、外貿(mào)建站、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容