久久精品水蜜桃av综合天堂,久久精品丝袜高跟鞋,精品国产肉丝袜久久,国产一区二区三区色噜噜,黑人video粗暴亚裔
站長百科 | 數(shù)字化技能提升教程 數(shù)字化時代生存寶典
首頁
數(shù)字化百科
電子書
建站程序
開發(fā)
服務器
辦公軟件
開發(fā)教程
服務器教程
軟件使用教程
運營教程
熱門電子書
WordPress教程
寶塔面板教程
CSS教程
Shopify教程
導航
程序頻道
推廣頻道
網(wǎng)賺頻道
人物頻道
網(wǎng)站程序
網(wǎng)頁制作
云計算
服務器
CMS
論壇
網(wǎng)店
虛擬主機
cPanel
網(wǎng)址導航
WIKI使用導航
WIKI首頁
最新資訊
網(wǎng)站程序
站長人物
頁面分類
使用幫助
編輯測試
創(chuàng)建條目
網(wǎng)站地圖
站長百科導航
站長百科
主機偵探
IDCtalk云說
跨境電商導航
WordPress啦
站長專題
網(wǎng)站推廣
網(wǎng)站程序
網(wǎng)站賺錢
虛擬主機
cPanel
網(wǎng)址導航專題
云計算
微博營銷
虛擬主機管理系統(tǒng)
開放平臺
WIKI程序與應用
美國十大主機
編輯“
JVM
”
人物百科
|
營銷百科
|
網(wǎng)賺百科
|
站長工具
|
網(wǎng)站程序
|
域名主機
|
互聯(lián)網(wǎng)公司
|
分類索引
跳轉至:
導航
、?
搜索
警告:
您沒有登錄。如果您做出任意編輯,您的IP地址將會公開可見。如果您
登錄
或
創(chuàng)建
一個賬戶,您的編輯將歸屬于您的用戶名,且將享受其他好處。
反垃圾檢查。
不要
加入這個!
[[Image:Jvm 2.jpg|right|frame|JVM]] '''JVM'''(Java Virtual Machine),即[[Java]]虛擬機,又名爪哇虛擬器,是一個虛構出來的計算機,通過在實際的[[計算機]]上仿真模擬各種計算機功能來實現(xiàn)的。Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統(tǒng)。 JVM屏蔽了與具體[[操作系統(tǒng)]]平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標[[代碼]](字節(jié)碼),就可以在多種平臺上不加修改地運行。 ==簡介== [[Image:JVM 1.jpg|right|400px|thumb|<center>JVM</center>]] Java語言的一個非常重要的特點就是與平臺的無關性。而使用Java虛擬機是實現(xiàn)這一特點的關鍵。一般的[[高級語言]]如果要在不同的平臺上運行,至少需要編譯成不同的目標代碼。而引入Java語言虛擬機后,Java語言在不同平臺上運行時不需要重新編譯。 Java語言使用模式Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行。Java虛擬機在執(zhí)行字節(jié)碼時,把字節(jié)碼解釋成具體平臺上的機器指令執(zhí)行。 Java虛擬機是Java語言底層實現(xiàn)的基礎,對Java語言感興趣的人都應對Java虛擬機有個大概的了解。這有助于理解Java語言的一些性質,也有助于使用Java語言。對于要在特定平臺上實現(xiàn)Java虛擬機的[[軟件]]人員,Java語言的編譯器作者以及要用[[硬件]]芯片實現(xiàn)Java虛擬機的人來說,則必須深刻理解Java虛擬機的規(guī)范。另外,如果你想擴展Java語言,或是把其它語言編譯成Java語言的字節(jié)碼,你也需要深入地了解Java虛擬機。 JVM(Java虛擬機)一種用于計算設備的規(guī)范,可用不同的方式(軟件或硬件)加以實現(xiàn)。編譯虛擬機的指令集與編譯微處理器的指令集非常類似。Java虛擬機包括一套字節(jié)碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。 Java虛擬機(JVM)是可運行Java代碼的假想計算機。只要根據(jù)JVM規(guī)格描述將解釋器移植到特定的計算機上,就能保證經過編譯的任何Java代碼能夠在該系統(tǒng)上運行。 Java虛擬機是一個想象中的機器,在實際的計算機上通過軟件模擬來實現(xiàn)。Java虛擬機有自己想象中的硬件,如處理器、堆棧、寄存器等,還具有相應的指令系統(tǒng)。 ==數(shù)據(jù)類型== [[Image:JVM 3.gif|right]] Java虛擬機支持Java語言的基本數(shù)據(jù)類型如下: *byte://1字節(jié)有符號整數(shù)的補碼 *short://2字節(jié)有符號整數(shù)的補碼 *int://4字節(jié)有符號整數(shù)的補碼 *long://8字節(jié)有符號整數(shù)的補碼 *float://4字節(jié)IEEE754單精度浮點數(shù) *double://8字節(jié)IEEE754雙精度浮點數(shù) *char://2字節(jié)無符號Unicode字符 Java類型檢查都是在編譯時完成的。上面列出的原始數(shù)據(jù)類型的數(shù)據(jù)在Java執(zhí)行時不需要用硬件標記。操作這些原始[[數(shù)據(jù)]]類型數(shù)據(jù)的字節(jié)碼(指令)本身就已經指出了操作數(shù)的數(shù)據(jù)類型,例如iadd、ladd、fadd和dadd指令都是把兩個數(shù)相加,其操作數(shù)類型別是int、long、float和double。 虛擬機沒有給boolean(布爾)類型設置單獨的指令。boolean型的數(shù)據(jù)是由integer指令,包括integer返回來處理的。boolean型的數(shù)組則是用byte數(shù)組來處理的。虛擬機使用IEEE754格式的浮點數(shù)。不支持IEEE格式的較舊的計算機,在運行Java數(shù)值計算程序時,可能會非常慢。 虛擬機支持的其它數(shù)據(jù)類型包括: *object//對一個Javaobject(對象)的4字節(jié)引用 *returnAddress//4字節(jié),用于jsr/ret/jsr-w/ret-w指令 注:Java數(shù)組被當作object處理。 虛擬機的規(guī)范對于object內部的結構沒有任何特殊的要求。在[[Sun]]公司的實現(xiàn)中,對object的引用是一個句柄,其中包含一對指針:一個指針指向該object的方法表,另一個指向該object的數(shù)據(jù)。用Java虛擬機的字節(jié)碼表示的程序應該遵守類型規(guī)定。Java虛擬機的實現(xiàn)應拒絕執(zhí)行違反了類型規(guī)定的字節(jié)碼程序。Java虛擬機由于字節(jié)碼定義的限制似乎只能運行于32位地址空間的機器上。 但是可以創(chuàng)建一個Java虛擬機,它自動地把字節(jié)碼轉換成64位的形式。從Java虛擬機支持的數(shù)據(jù)類型可以看出,Java對數(shù)據(jù)類型的內部格式進行了嚴格規(guī)定,這樣使得各種Java虛擬機的實現(xiàn)對數(shù)據(jù)的解釋是相同的,從而保證了Java的與平臺無關性和可移植性。 ==規(guī)格描述== JVM的設計目標是提供一個基于抽象規(guī)格描述的計算機模型,為解釋程序開發(fā)人員提范的任何系統(tǒng)上運行。JVM對其實現(xiàn)的某些方面給出了具體的定義,特別是對Java可執(zhí)行代碼,即字節(jié)碼(Bytecode)的格式給出了明確的規(guī)格。這一規(guī)格包括操作碼和操作數(shù)的語法和數(shù)值、標識符的數(shù)值表示方式、以及Java類文件中的Java對象、常量緩沖池在JVM的存儲映象。這些定義為JVM解釋器開發(fā)人員提供了所需的信息和開發(fā)環(huán)境。Java的設計者希望給開發(fā)人員以隨心所欲使用Java的自由。 JVM定義了控制Java代碼解釋執(zhí)行和具體實現(xiàn)的五種規(guī)格,它們是: *JVM指令系統(tǒng) *JVM寄存器 *JVM棧結構 *JVM碎片回收堆 *JVM存儲區(qū) ===指令系統(tǒng)=== JVM指令系統(tǒng)同其他計算機的指令系統(tǒng)極其相似。Java指令也是由 操作碼和操作數(shù)兩部分組成。操作碼為8位[[二進制]]數(shù),操作數(shù)進緊隨在操作碼的后面,其長度根據(jù)需要而不同。操作碼用于指定一條指令操作的性質(在這里采用匯編符號的形式進行說明),如iload表示從存儲器中裝入一個整數(shù),anewarray表示為一個新數(shù)組分配空間,iand表示兩個整數(shù)的“與”,ret用于流程控制,表示從對某一方法的調用中返回。 當長度大于8位時,操作數(shù)被分為兩個以上字節(jié)存放。JVM采用了"big endian"的編碼方式來處理這種情況,即高位bits存放在低字節(jié)中。這同 Motorola及其他的RISC CPU采用的編碼方式是一致的,而與[[Intel]]采用的“l(fā)ittle endian”的編碼方式即低位bits存放在低位字節(jié)的方法不同。 Java指令系統(tǒng)是以Java語言的實現(xiàn)為目的設計的,其中包含了用于調用方法和監(jiān)視多先程系統(tǒng)的指令。Java的8位操作碼的長度使得JVM最多有256種指令,已使用了160多種操作碼。 ===寄存器 === 所有的[[CPU]]均包含用于保存系統(tǒng)狀態(tài)和處理器所需信息的寄存器組。如果虛擬機定義較多的寄存器,便可以從中得到更多的信息而不必對?;騼却孢M行訪問,這有利于提高運行速度。然而,如果虛擬機中的寄存器比實際CPU的寄存器多,在實現(xiàn)虛擬機時就會占用處理器大量的時間來用常規(guī)存儲器模擬寄存器,這反而會降低虛擬機的效率。針對這種情況,JVM只設置了4個最為常用的寄存器。它們是: *pc程序計數(shù)器 *optop操作數(shù)棧頂指針 *frame當前執(zhí)行環(huán)境指針 *vars指向當前執(zhí)行環(huán)境中第一個局部變量的指針所有寄存器均為32位。pc用于記錄程序的執(zhí)行。optop,frame和vars用于記錄指向Java棧區(qū)的指針 ===棧結構=== 作為基于棧結構的計算機,Java棧是JVM存儲信息的主要方法。當JVM得到一個Java字節(jié)碼[[應用程序]]后,便為該代碼中一個類的每一個方法創(chuàng)建一個??蚣?,以保存該方法的狀態(tài)信息。每個??蚣馨ㄒ韵氯愋畔ⅲ?*局部變量 *執(zhí)行環(huán)境 *操作數(shù)棧 局部變量用于存儲一個類的方法中所用到的局部變量。vars寄存器指向該變量表中的第一個局部變量。 執(zhí)行環(huán)境用于保存解釋器對Java字節(jié)碼進行解釋過程中所需的信息。它們是:上次調用的方法、局部變量指針和操作數(shù)棧的棧頂和棧底指針。執(zhí)行環(huán)境是一個執(zhí)行一個方法的控制中心。例如:如果解釋器要執(zhí)行iadd(整數(shù)加法),首先要從frame寄存器中找到當前執(zhí)行環(huán)境,而后便從執(zhí)行環(huán)境中找到操作數(shù)棧,從棧頂彈出兩個整數(shù)進行加法運算,最后將結果壓入棧頂。 操作數(shù)棧用于存儲運算所需操作數(shù)及運算的結果 ===碎片回收堆=== Java類的實例所需的存儲空間是在堆上分配的。解釋器具體承擔為類實例分配空間的工作。解釋器在為一個實例分配完存儲空間后,便開始記錄對該實例所占用的[[內存]]區(qū)域的使用。一旦對象使用完畢,便將其回收到堆中。 在Java語言中,除了new語句外沒有其他方法為一對象申請和釋放內存。對內存進行釋放和回收的工作是由Java運行系統(tǒng)承擔的。這允許Java運行系統(tǒng)的設計者自己決定碎片回收的方法。在SUN公司開發(fā)的Java解釋器和Hot Java環(huán)境中,碎片回收用后臺[[線程]]的方式來執(zhí)行。這不但為運行系統(tǒng)提供了良好的性能,而且使程序設計人員擺脫了自己控制內存使用的風險。 ===存儲區(qū)=== JVM有兩類存儲區(qū):常量緩沖池和方法區(qū)。常量緩沖池用于存儲類名稱、方法和字段名稱以及串常量。方法區(qū)則用于存儲Java方法的字節(jié)碼。對于這兩種存儲區(qū)域具體實現(xiàn)方式在JVM規(guī)格中沒有明確規(guī)定。這使得Java應用程序的存儲布局必須在運行過程中確定,依賴于具體平臺的實現(xiàn)方式。 JVM是為Java字節(jié)碼定義的一種獨立于具體平臺的規(guī)格描述,是Java平臺獨立性的基礎。JVM還存在一些限制和不足,有待于進一步的完善,但無論如何,JVM的思想是成功的。 對比分析:如果把Java原程序想象成C++原程序,Java原程序編譯后生成的字節(jié)碼就相當于[[C++]]原程序編譯后的80x86的機器碼(二進制程序文件),JVM虛擬機相當于80x86計算機系統(tǒng),Java解釋器相當于80x86CPU。在80x86CPU上運行的是機器碼,在Java解釋器上運行的是Java字節(jié)碼。 Java解釋器相當于運行Java字節(jié)碼的“CPU”,但該“CPU”不是通過硬件實現(xiàn)的,而是用軟件實現(xiàn)的。Java解釋器實際上就是特定的平臺下的一個應用程序。只要實現(xiàn)了特定平臺下的解釋器程序,Java字節(jié)碼就能通過解釋器程序在該平臺下運行,這是Java跨平臺的根本。當前,并不是在所有的平臺下都有相應Java解釋器程序,這也是Java并不能在所有的平臺下都能運行的原因,它只能在已實現(xiàn)了Java解釋器程序的平臺下運行。 ==JVM的運行過程== 虛擬機通過調用某個指定類的方法main啟動,傳遞給main一個字符串數(shù)組參數(shù),使指定的類被裝載,同時鏈接該類所使用的其它的類型,并且初始化它們。例如對于程序: <pre> class HelloApp { public static void main(String[] args) { System.out.println("Hello World!"); for (int i = 0; i < args.length; i++ ) { System.out.println(args); } } }</pre> 編譯后在命令行模式下鍵入: java HelloApp run virtual machine 將通過調用HelloApp的方法main來啟動java虛擬機,傳遞給main一個包含三個字符串"run"、"virtual"、"machine"的數(shù)組?,F(xiàn)在我們略述虛擬機在執(zhí)行HelloApp時可能采取的步驟。 開始試圖執(zhí)行類HelloApp的main方法,發(fā)現(xiàn)該類并沒有被裝載,也就是說虛擬機當前不包含該類的二進制代表,于是虛擬機使用ClassLoader試圖尋找這樣的二進制代表。如果這個[[進程]]失敗,則拋出一個異常。類被裝載后同時在main方法被調用之前,必須對類HelloApp與其它類型進行[[鏈接]]然后初始化。鏈接包含三個階段:檢驗,準備和解析。 檢驗檢查被裝載的主類的符號和語義,準備則創(chuàng)建類或接口的靜態(tài)域以及把這些域初始化為標準的默認值,解析負責檢查主類對其它類或接口的符號引用,在這一步它是可選的。類的初始化是對類中聲明的靜態(tài)初始化函數(shù)和靜態(tài)域的初始化構造方法的執(zhí)行。一個類在初始化之前它的父類必須被初始化。整個過程如下: [[Image:Jvm 5.jpg|JAVA虛擬機的運行過程]] ==相關條目== *[[JRuby]] *[[VMware]] ==參考來源== *http://baike.baidu.com/view/160708.htm *http://zh.wikipedia.org/zh-cn/JVM *http://www.hudong.com/wiki/JVM [[category:JAVA|J]] [[category:虛擬機|J]]
摘要:
請注意,您對站長百科的所有貢獻都可能被其他貢獻者編輯,修改或刪除。如果您不希望您的文字被任意修改和再散布,請不要提交。
您同時也要向我們保證您所提交的內容是您自己所作,或得自一個不受版權保護或相似自由的來源(參閱
Wordpress-mediawiki:版權
的細節(jié))。
未經許可,請勿提交受版權保護的作品!
取消
編輯幫助
(在新窗口中打開)
取自“
http://kktzf.com.cn/wiki/JVM
”