史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 程式 & 網頁設計技術文件
忘記密碼?
論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2003-07-01, 05:58 PM   #1 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 JVM(JAVA虛擬機介紹)

Java虛擬機(JVM)是可執行Java程式碼的假想電腦。只要根據JVM規格描述將解釋器移植到特定的電腦上,就能保證經過編譯的任何Java 程式碼能夠在該系統上執行。本文首先簡要介紹從Java文件的編譯到最終執行的程序,隨後對JVM規格描述作一說明。

  一.Java源文件的編譯、下載、解釋和執行
  Java應用程式的開發週期包括編譯、下載、解釋和執行幾個部分。Java編譯程序將Java源程序翻譯為JVM可執行程式碼—字元碼。這一編譯程序同C /C++的編譯有些不同。當C編譯器編譯產生一個對象的程式碼時,該程式碼是為在某一特定硬體平台執行而產生的。因此,在編譯程序中,編譯程序通過查表將所有對符號的引用轉換為特定的記憶體偏移量,以保證程序執行。J ava編譯器卻不將對變量和方法的引用編譯為數值引用,也不確定程序執行程序中的記憶體佈局,而是將這些符號引用信息保留在字元碼中,由解釋器在執行程序中創立記憶體佈局,然後再通過查表來確定一個方法所在的位址。這樣就有效的保證了J ava的可移植性和安全性。
執行JVM字元碼的工作是由解釋器來完成的。解釋執行程序分三部進行:程式碼的裝入、程式碼的校驗和程式碼的執行。裝入程式碼的工作由"類裝載器" (class loader)完成。類裝載器負責裝入執行一個程序需要的所有程式碼,這也包括程序程式碼中的類所繼承的類和被其使用的類。當類裝載器裝入一個類時,該類被放在自己的名字空間中。除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。在本台電腦上的所有類都在同一位址空間內,而所有從外部引進的類,都有一個自己獨立的名字空間。這使得本機類通過共享相同的名字空間獲得較高的執行效率,同時又保證它們與從外部引進的類不會相互影響。當裝入了執行程序需要的所有類後,解釋器便可確定整個可執行程序的記憶體佈局。解釋器為符號引用同特定的位址空間建立對應關係及查詢表。通過在這一階段確定程式碼的記憶體佈局,J ava很好地解決了由超類改變而使子類崩潰的問題,同時也防止了程式碼對位址的非法訪問。
隨後,被裝入的程式碼由字元碼校驗器進行檢查。校驗器可發現操作數棧溢出,非法資料類型轉化等多種錯誤。通過校驗後,程式碼便開始執行了。
  Java字元碼的執行有兩種方式:
  1.即時編譯方式:解釋器先將字元碼編譯成機器碼,然後再執行該機器碼。
  2.解釋執行方式:解釋器通過每次解釋並執行一小段程式碼來完成Java字元碼程 序的所有操作。
  通常採用的是第二種方法。由於JVM規格描述具有足夠的靈活性,這使得將字元碼翻譯為機器程式碼的工作具有較高的效率。對於那些對執行速度要求較高的應用程式,解釋器可將J ava字元碼即時編譯為機器碼,從而很好地保證了Java程式碼的可移植性和高性能。

  二.JVM規格描述
  JVM的設計目標是提供一個關於抽像規格描述的電腦模型,為解釋程序開發人員提很好的靈活性,同時也確保Java程式碼可在符合該規範的任何系統上執行。J VM對其實現的某些方面給出了具體的定義,特別是對Java可執行程式碼,即字元碼(Bytecode)的格式給出了明確的規格。這一規格包括操作碼和操作數的語法和數值、標識符的數值表示方式、以及J ava類文件中的Java對像、常量緩衝池在JVM的存儲映像。這些定義為JVM解釋器開發人員提供了所需的信息和開發環境。Java的設計者希望給開發人員以隨心所欲使用J ava的自由。
  JVM定義了控制Java程式碼解釋執行和具體實現的五種規格,它們是:
  JVM指令系統
  JVM暫存器
  JVM棧結構
  JVM碎片回收堆
  JVM存儲區
  2.1JVM指令系統
JVM指令系統同其他電腦的指令系統極其相似。Java指令也是由 操作碼和操作數兩部分組成。操作碼為8位二進制數,操作數進緊隨在操作碼的後面,其長度根據需要而不同。操作碼用於指定一條指令操作的性質(在這裡我們採用彙編符號的形式進行說明),如i load表示從存儲器中裝入一個整數,anewarray表示為一個新陣列分配空間,iand表示兩個整數的"與",ret用於流程控制,表示從對某一方法的使用中返回。當長度大於8 位時,操作數被分為兩個以上字元存放。JVM採用了"big endian"的編碼方式來處理這種情況,即高位bits存放在低字元中。這同 Motorola及其他的RISC CPU採用的編碼方式是一致的,而與Intel採用的"little endian "的編碼方式即低位bits存放在低位字元的方法不同。
  Java指令系統是以Java語言的實現為目的設計的,其中包含了用於使用方法和監視多先程系統的指令。Java的8位操作碼的長度使得J VM最多有256種指令,目前已使用了160多種操作碼。
  2.2JVM指令系統
所有的CPU均包含用於儲存系統狀態和處理器所需信息的暫存器組。如果虛擬機定義較多的暫存器,便可以從中得到更多的信息而不必對棧或記憶體進行訪問,這有利於提高執行速度。然而,如果虛擬機中的暫存器比實際C PU的暫存器多,在實現虛擬機時就會佔用處理器大量的時間來用一般存儲器模擬暫存器,這反而會降低虛擬機的效率。針對這種情況,JV M只設定了4個最為常用的暫存器。它們是:
  pc程序計數器
  optop操作數棧頂指針
  frame當前執行環境指針
  vars指向當前執行環境中第一個局部變量的指針
所有暫存器均為32位。pc用於記錄程序的執行。optop,frame和vars用於記錄指向Java棧區的指針。
  2.3JVM棧結構
  作為關於棧結構的電腦,Java棧是JVM存儲信息的主要方法。當JVM得到一個Java字元碼應用程式後,便為該程式碼中一個類的每一個方法新增一個棧框架,以儲存該方法的狀態信息。每個棧框架包括以下三類信息:
  局部變量
  執行環境
  操作數棧
局部變量用於存儲一個類的方法中所用到的局部變量。vars暫存器指向該變量表中的第一個局部變量。
  執行環境用於儲存解釋器對Java字元碼進行解釋程序中所需的信息。它們是:上次使用的方法、局部變量指針和操作數棧的棧頂和棧底指針。執行環境是一個執行一個方法的控制中心。例如:如果解釋器要執行i add(整數加法),首先要從frame暫存器中找到當前執行環境,而後便從執行環境中找到操作數棧,從棧頂彈出兩個整數進行加法運算,最後將結果壓入棧頂。
操作數棧用於存儲運算所需操作數及運算的結果。
  2.4JVM碎片回收堆
  Java類的實例所需的存儲空間是在堆上分配的。解釋器具體承擔為類實例分配空間的工作。解釋器在為一個實例分配完存儲空間後,便開始記錄對該實例所佔用的記憶體區域的使用。一旦對像使用完畢,便將其回收到堆中。
在Java語言中,除了new語句外沒有其他方法為一對像申請和釋放記憶體。對記憶體進行釋放和回收的工作是由Java執行系統承擔的。這允許J ava執行系統的設計者自己決定碎片回收的方法。在SUN公司開發的Java解釋器和Hot Java環境中,碎片回收用後台線程的方式來執行。這不但為執行系統提供了良好的性能,而且使程序設計人員擺脫了自己控制記憶體使用的風險。
  2.5JVM存儲區
JVM有兩類存儲區:常量緩衝池和方法區。常量緩衝池用於存儲類名稱、方法和字段名稱以及串常量。方法區則用於存儲Java方法的字元碼。對於這兩種存儲區域具體實現方式在J VM規格中沒有明確規定。這使得Java應用程式的存儲佈局必須在執行程序中確定,依賴於具體平台的實現方式。
  JVM是為Java字元碼定義的一種獨立於具體平台的規格描述,是Java平台獨立性的基礎。目前的JVM還存在一些限制和不足,有待於進一步的完善,但無論如何,J VM的思想是成功的。

  對比分析:如果把Java原程序想像成我們的C++原程序,Java原程序編譯後產生的字元碼就相當於C++原程序編譯後的80x86的機器碼(二進製程序文件),J VM虛擬機相當於80x86電腦系統,Java解釋器相當於80x86CPU。在80x86CPU上執行的是機器碼,在Java解釋器上執行的是Java字元碼。
  Java解釋器相當於執行Java字元碼的「CPU」,但該「CPU」不是通過硬體實現的,而是用軟體實現的。Java解釋器實際上就是特定的平台下的一個應用程式。只要實現了特定平台下的解釋器程序,J ava字元碼就能通過解釋器程序在該平台下執行,這是Java跨平台的根本。當前,並不是在所有的平台下都有相應Java解釋器程序,這也是J ava並不能在所有的平台下都能執行的原因,它只能在已實現了Java解釋器程序的平台下執行。
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 09:06 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1