<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    海闊天空

    I'm on my way!
    隨筆 - 17, 文章 - 69, 評論 - 21, 引用 - 0
    數據加載中……

    java程序的運行機制

    (一)  Java應用程序的開發周期包括編譯、下載、解釋和執行幾個部分。Java編譯程序將 Java源程序翻譯為JVM可執行代碼--字節碼。這一編譯過程同C/C++的編譯有些不同。當C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定 硬件平臺運行而產生的。因此,在編譯過程中,編譯程序通過查表將所有對符號的引用轉換為特定的內存偏移量,以保證程序運行。Java編譯器卻不將對變量和 方法的引用編譯為數值引用,也不確定程序執行過程中的內存布局,而是將這些符號引用信息保留在字節碼中,由解釋器在運行過程中創立內存布局,然后再通過查 表來確定一個方法所在的地址。這樣就有效的保證了Java的可移植性和安全性。

    運行JVM字節碼的工作是由解釋器( java命令 )來完成的。解釋執行過程分三部進行:代碼的裝入、代碼的校驗和代碼的執行。裝入代碼的工作由"類裝載器"(class loader)完成。類裝載器負責裝入運行一個程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被其調用的類。當類裝載器裝入一個類時,該類被放 在自己的名字空間中。除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。在本臺計算機上的所有類都在同一地址空間內,而所有從外 部引進的類,都有一個自己獨立的名字空間。這使得本地類通過共享相同的名字空間獲得較高的運行效率,同時又保證它們與從外部引進的類不會相互影響。當裝入 了運行程序需要的所有類后,解釋器便可確定整個可執行程序的內存布局。解釋器為符號引用同特定的地址空間建立對應關系及查詢表。通過在這一階段確定代碼的 內存布局,Java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了代碼對地址的非法訪問。

     

    隨后,被裝入的代碼由字節碼校驗器進行檢查。校驗器可發現操作數棧溢出,非法數據類型轉化等多種錯誤。通過校驗后,代碼便開始執行了。

     

    Java字節碼的執行有兩種方式:

    1.即時編譯方式:解釋器先將字節碼編譯成機器碼,然后再執行該機器碼。

    2.解釋執行方式:解釋器通過每次解釋并執行一小段代碼來完成Java字節碼程序的所有操作。

     

    通常采用的是第二種方法。由于JVM規格描述具有足夠的靈活性,這使得將字節碼翻譯為機器代碼的工作

    具有較高的效率。對于那些對運行速度要求較高的應用程序,解釋器可將Java字節碼即時編譯為機器碼,從而很好地保證了Java代碼的可移植性和高性能。

    (二)JVM規格描述
    JVM的設計目標是提供一個基于抽象規格描述的計算機模型,為解釋程序開發人員提很好的靈活性,同時也確保Java代碼可在符合該規范的任何系統上運行。JVM對其實現的某些方面給出了具體的定義,特別是對Java可執行代碼,即字節碼(Bytecode)的格式給出了明確的規格。這一規格包括操作碼和操作數的語法和數值、標識符的數值表示方式、以及Java類文件中的Java對象、常量緩沖池在JVM的存儲映象。這些定義為JVM解釋器開發人員提供了所需的信息和開發環境。Java的設計者希望給開發人員以隨心所欲使用Java的自由。
    JVM定義了控制Java代碼解釋執行和具體實現的五種規格,它們是:
    JVM指令系統
    JVM寄存器
    JVM棧結構
    JVM碎片回收堆
    JVM存儲區
    2.1JVM指令系統
    JVM指令系統同其他計算機的指令系統極其相似。Java指令也是由 操作碼和操作數兩部分組成。操作碼為8位二進制數,操作數進緊隨在操作碼的后面,其長度根據需要而不同。操作碼用于指定一條指令操作的性質(在這里我們采 用匯編符號的形式進行說明),如iload表示從存儲器中裝入一個整數,anewarray表示為一個新數組分配空間,iand表示兩個整數的" 與",ret用于流程控制,表示從對某一方法的調用中返回。當長度大于8位時,操作數被分為兩個以上字節存放。JVM采用了"big endian"的編碼方式來處理這種情況,即高位bits存放在低字節中。這同 Motorola及其他的RISC CPU采用的編碼方式是一致的,而與Intel采用的"little endian "的編碼方式即低位bits存放在低位字節的方法不同。
    Java指令系統是以Java語言的實現為目的設計的,其中包含了用于調用方法和監視多先程系統的指令。Java的8位操作碼的長度使得JVM最多有256種指令,目前已使用了160多種操作碼。
    2.2JVM指令系統
    所有的CPU均包含用于保存系統狀態和處理器所需信息的寄存器組。如果虛擬機定義較多的寄存器,便可以從中得到更多的信息而不必對?;騼却孢M行訪問,這 有利于提高運行速度。然而,如果虛擬機中的寄存器比實際CPU的寄存器多,在實現虛擬機時就會占用處理器大量的時間來用常規存儲器模擬寄存器,這反而會降 低虛擬機的效率。針對這種情況,JVM只設置了4個最為常用的寄存器。它們是:
    pc程序計數器
    optop操作數棧頂指針
    frame當前執行環境指針
    vars指向當前執行環境中第一個局部變量的指針
    所有寄存器均為32位。pc用于記錄程序的執行。optop,frame和vars用于記錄指向Java棧區的指針。
    2.3JVM棧結構
    作為基于棧結構的計算機,Java棧是JVM存儲信息的主要方法。當JVM得到一個Java字節碼應用程序后,便為該代碼中一個類的每一個方法創建一個??蚣?,以保存該方法的狀態信息。每個??蚣馨ㄒ韵氯愋畔ⅲ?br /> 局部變量
    執行環境
    操作數棧
    局部變量用于存儲一個類的方法中所用到的局部變量。vars寄存器指向該變量表中的第一個局部變量。
    執行環境用于保存解釋器對Java字節碼進行解釋過程中所需的信息。它們是:上次調用的方法、局部變量指針和操作數棧的棧頂和棧底指針。執行環境是一個 執行一個方法的控制中心。例如:如果解釋器要執行iadd(整數加法),首先要從frame寄存器中找到當前執行環境,而后便從執行環境中找到操作數棧, 從棧頂彈出兩個整數進行加法運算,最后將結果壓入棧頂。
    操作數棧用于存儲運算所需操作數及運算的結果。
    2.4JVM碎片回收堆
    Java類的實例所需的存儲空間是在堆上分配的。解釋器具體承擔為類實例分配空間的工作。解釋器在為一個實例分配完存儲空間后,便開始記錄對該實例所占用的內存區域的使用。一旦對象使用完畢,便將其回收到堆中。
    在Java語言中,除了new語句外沒有其他方法為一對象申請和釋放內存。對內存進行釋放和回收的工作是由Java運行系統承擔的。這允許Java運行 系統的設計者自己決定碎片回收的方法。在SUN公司開發的Java解釋器和Hot Java環境中,碎片回收用后臺線程的方式來執行。這不但為運行系統提供了良好的性能,而且使程序設計人員擺脫了自己控制內存使用的風險。
    2.5JVM存儲區
    JVM有兩類存儲區:常量緩沖池和方法區。常量緩沖池用于存儲類名稱、方法和字段名稱以及串常量。方法區則用于存儲Java方法的字節碼。對于這兩種存 儲區域具體實現方式在JVM規格中沒有明確規定。這使得Java應用程序的存儲布局必須在運行過程中確定,依賴于具體平臺的實現方式。
    JVM是為Java字節碼定義的一種獨立于具體平臺的規格描述,是Java平臺獨立性的基礎。目前的JVM還存在一些限制和不足,有待于進一步的完善,但無論如何,JVM的思想是成功的。
    對比分析:如果把Java原程序想象成我們的C++原程序,Java原程序編譯后生成的字節碼就相當于C++原程序編譯后的80x86的機器碼(二進制程序文件),JVM虛擬機相當于80x86計算機系統,Java解釋器相當于80x86CPU。在80x86CPU上運行的是機器碼,在Java解釋器上運行的是Java字節碼。
    Java解釋器相當于運行Java字節碼的“CPU”,但該“CPU”不是通過硬件實現的,而是用軟件實現的。Java解釋器實際上就是特定的平臺下的 一個應用程序。只要實現了特定平臺下的解釋器程序,Java字節碼就能通過解釋器程序在該平臺下運行,這是Java跨平臺的根本。當前,并不是在所有的平 臺下都有相應Java解釋器程序,這也是Java并不能在所有的平臺下都能運行的原因,它只能在已實現了Java解釋器程序的平臺下運行。

     

    Java宣稱的一處編寫隨處運行就是由JVM來完成. 在sun的網站上你可以下載到基于各種cpu和各種操作系統的Jdk和jre的下載版本,只要尋找到合適你使用的版本,以前你所編寫的class文件copy到其他的機器上可以直接運行,不需要再編譯.

     

    其實j2se是一種規范,這種規范約定了其跨平臺執行的所需要關注很多實現,基于該規范開發人員可以任意編寫自己的Java代碼而不需要關心這個程序可能在其他的機器和cpu上無法很好運行問題.

     

    其實你也可以看到Ibm和Weblogic都有基于j2se規范的自己實現的Java 虛擬機 . 而且Sun所宣稱的不需要編譯而可以直接用class文件在各個JVM上直接運行并不精確,博格曾經遇到過用sun jre開發的class文件在ibm jre上有一個自動轉換的過程,然后這個類可以很好的工作了,幸好這種情況是自動完成,否則我們又要陷入類似于各種c c++的版本編譯器兼容性問題中.

     

    以下下摘錄了幾個主要的概念:

     

    JVM Java Virtual Machine(Java虛擬機),它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。 Java虛擬機有自己完善的硬件架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM屏蔽了與具體操作系統平臺相關的信息,使得Java程序只 需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。Java虛擬機在執行字節碼時,實際上最終還是把字節碼解釋成具 體平臺上的機器指令執行。

     

    JRE Java Runtime Environment(Java運行環境),運行JAVA程序所必須的環境的集合,包含JVM標準實現及Java核心類庫。

     

    JSDK Java Software Development Kit,和JDK以及J2SE等同。

     

    JDK Java Development Kit(Java開發工具包):包括運行環境、編譯工具及其它工具、源代碼等,基本上和J2SE等同。

     

    J2ME Java 2 Micro Edition(JAVA2精簡版)API規格基于J2SE ,但是被修改為可以適合某種產品的單一要求。J2ME使JAVA 程序可以很方便的應用于電話卡、尋呼機等小型設備,它包括兩種類型的組件,即配置(configuration)和描述(profile)。

     

    J2EE Java 2 Enterprise Edition(JAVA2企業版),使用Java進行企業開發的一套擴展標準,必須基于J2SE,提供一個基于組件設計、開發、集合、展開企業應用的途 徑。J2EE 平臺提供了多層、分布式的應用模型,重新利用組件的能力,統一安全的模式以及靈活的處理控制能力。 J2EE包括EJB, JTA, JDBC, JCA, JMX, JNDI, JMS, JavaMail, Servlet, JSP等規范。

     

    J2SE Java 2 Standard Edition(JAVA2標準版),用來開發Java程序的基礎,包括編譯器、小工具、運行環境,SUN發布的標準版本中還包括核心類庫的所有源代碼。


    摘自:http://www.diybl.com/course/3_program/java/javajs/20090304/157613.html

    posted on 2009-08-22 09:52 石頭@ 閱讀(6886) 評論(0)  編輯  收藏 所屬分類: java_base

    主站蜘蛛池模板: 亚洲午夜精品久久久久久浪潮| 久久人午夜亚洲精品无码区| 亚洲精品色婷婷在线影院| 亚洲免费二区三区| 国产精品午夜免费观看网站| 久久久久久亚洲精品无码| 亚洲视频一区网站| 久久久久亚洲精品成人网小说| 亚洲黄片毛片在线观看| 欧洲精品免费一区二区三区| 国产成人精品免费视| 在线毛片片免费观看| 国产精品免费视频观看拍拍| 美女啪啪网站又黄又免费| 亚洲精华国产精华精华液好用| 亚洲日韩乱码中文无码蜜桃 | 亚洲精品无码久久久久久久 | 看Aⅴ免费毛片手机播放| 亚洲精品天堂在线观看| 亚洲欧洲中文日产| 91久久亚洲国产成人精品性色| 日韩亚洲欧洲在线com91tv| 亚洲综合另类小说色区色噜噜| 国产伦一区二区三区免费| 韩国二级毛片免费播放| 免费黄色网址入口| 午夜两性色视频免费网站| 好吊妞视频免费视频| 在线观看无码的免费网站| 大学生美女毛片免费视频| 成人a免费α片在线视频网站| 中文字幕av无码无卡免费| 美女被cao免费看在线看网站| www视频在线观看免费| 欧洲一级毛片免费| 国产又大又粗又长免费视频| 免费毛片a在线观看67194| 亚洲成在人线aⅴ免费毛片| 免费毛片在线看片免费丝瓜视频| 成年女人毛片免费视频| 日韩视频免费在线|