欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Java虛擬機

中科永聯(lián)高級技術(shù)培訓中心(www.itisedu.com

      Java虛擬機(JVM)一種用于計算設備的規范,可用不同的方式(軟件或硬件)加以實(shí)現。編譯虛擬機的指令集與編譯微處理器的指令集非常類(lèi)似。Java虛擬機包括一套字節碼指令集、一組寄存器、一個(gè)棧、一個(gè)垃圾回收堆和一個(gè)存儲方法域。

      Java虛擬機(JVM)是可運行Java代碼的假想計算機。只要根據JVM規格描述將解釋器移植到特定的計算機上,就能保證經(jīng)過(guò)編譯的任何Java代碼能夠在該系統上運行。

      Java虛擬機是一個(gè)想象中的機器,在實(shí)際的計算機上通過(guò)軟件模擬來(lái)實(shí)現。Java虛擬機有自己想象中的硬件,如處理器、堆棧、寄存器等,還具有相應的指令系統。

一、Java虛擬機(JVM)概述

      1.為什么要使用Java虛擬機

      Java語(yǔ)言的一個(gè)非常重要的特點(diǎn)就是與平臺的無(wú)關(guān)性。而使用Java虛擬機是實(shí)現這一特點(diǎn)的關(guān)鍵。一般的高級語(yǔ)言如果要在不同的平臺上運行,至少需要編譯成不同的目標代碼。而引入Java語(yǔ)言虛擬機后,Java語(yǔ)言在不同平臺上運行時(shí)不需要重新編譯。Java語(yǔ)言使用模式Java虛擬機屏蔽了與具體平臺相關(guān)的信息,使得Java語(yǔ)言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。Java虛擬機在執行字節碼時(shí),把字節碼解釋成具體平臺上的機器指令執行。

      2.誰(shuí)需要了解Java虛擬機

      Java虛擬機是Java語(yǔ)言底層實(shí)現的基礎,對Java語(yǔ)言感興趣的人都應對Java虛擬機有個(gè)大概的了解。這有助于理解Java語(yǔ)言的一些性質(zhì),也有助于使用Java語(yǔ)言。對于要在特定平臺上實(shí)現Java虛擬機的軟件人員,Java語(yǔ)言的編譯器作者以及要用硬件芯片實(shí)現Java虛擬機的人來(lái)說(shuō),則必須深刻理解Java虛擬機的規范。另外,如果你想擴展Java語(yǔ)言,或是把其它語(yǔ)言編譯成Java語(yǔ)言的字節碼,你也需要深入地了解Java虛擬機。

      3.Java虛擬機支持的數據類(lèi)型

      Java虛擬機支持Java語(yǔ)言的基本數據類(lèi)型如下:

      byte://1字節有符號整數的補碼
      short://2字節有符號整數的補碼
      int://4字節有符號整數的補碼
      long://8字節有符號整數的補碼
      float://4字節IEEE754單精度浮點(diǎn)數
      double://8字節IEEE754雙精度浮點(diǎn)數
      char://2字節無(wú)符號Unicode字符

      幾乎所有的Java類(lèi)型檢查都是在編譯時(shí)完成的。上面列出的原始數據類(lèi)型的數據在Java執行時(shí)不需要用硬件標記。操作這些原始數據類(lèi)型數據的字節碼(指令)本身就已經(jīng)指出了操作數的數據類(lèi)型,例如iadd、ladd、fadd和dadd指令都是把兩個(gè)數相加,其操作數類(lèi)型別是int、long、float和double。虛擬機沒(méi)有給boolean(布爾)類(lèi)型設置單獨的指令。boolean型的數據是由integer指令,包括integer返回來(lái)處理的。boolean型的數組則是用byte數組來(lái)處理的。虛擬機使用IEEE754格式的浮點(diǎn)數。不支持IEEE格式的較舊的計算機,在運行Java數值計算程序時(shí),可能會(huì )非常慢。

      虛擬機支持的其它數據類(lèi)型包括:
      object//對一個(gè)Javaobject(對象)的4字節引用
      returnAddress//4字節,用于jsr/ret/jsr-w/ret-w指令
      注:Java數組被當作object處理。

      虛擬機的規范對于object內部的結構沒(méi)有任何特殊的要求。在Sun公司的實(shí)現中,對object的引用是一個(gè)句柄,其中包含一對指針:一個(gè)指針指向該object的方法表,另一個(gè)指向該object的數據。用Java虛擬機的字節碼表示的程序應該遵守類(lèi)型規定。Java虛擬機的實(shí)現應拒絕執行違反了類(lèi)型規定的字節碼程序。Java虛擬機由于字節碼定義的限制似乎只能運行于32位地址空間的機器上。但是可以創(chuàng )建一個(gè)Java虛擬機,它自動(dòng)地把字節碼轉換成64位的形式。從Java虛擬機支持的數據類(lèi)型可以看出,Java對數據類(lèi)型的內部格式進(jìn)行了嚴格規定,這樣使得各種Java虛擬機的實(shí)現對數據的解釋是相同的,從而保證了Java的與平臺無(wú)關(guān)性和可
移植性。


二、Java虛擬機JVM規格描述

      JVM的設計目標是提供一個(gè)基于抽象規格描述的計算機模型,為解釋程序開(kāi)發(fā)人員提很好的靈活性,同時(shí)也確保Java代碼可在符合該規范的任何系統上運行。JVM對其實(shí)現的某些方面給出了具體的定義,特別是對Java可執行代碼,即字節碼(Bytecode)的格式給出了明確的規格。這一規格包括操作碼和操作數的語(yǔ)法和數值、標識符的數值表示方式、以及Java類(lèi)文件中的Java對象、常量緩沖池在JVM的存儲映象。這些定義為JVM解釋器開(kāi)發(fā)人員提供了所需的信息和開(kāi)發(fā)環(huán)境。Java的設計者希望給開(kāi)發(fā)人員以隨心所欲使用Java的自由。     JVM定義了控制Java代碼解釋執行和具體實(shí)現的五種規格,它們是:   
      *JVM指令系統   
      *JVM寄存器   
      *JVM棧結構   
      *JVM碎片回收堆   
      *JVM存儲區


      2.1JVM指令系統
      JVM指令系統同其他計算機的指令系統極其相似。Java指令也是由 操作碼和操作數兩部分組成。操作碼為8位二進(jìn)制數,操作數進(jìn)緊隨在操作碼的后面,其長(cháng)度根據需要而不同。操作碼用于指定一條指令操作的性質(zhì)(在這里我們采用匯編符號的形式進(jìn)行說(shuō)明),如iload表示從存儲器中裝入一個(gè)整數,anewarray表示為一個(gè)新數組分配空間,iand表示兩個(gè)整數的"與",ret用于流程控制,表示從對某一方法的調用中返回。當長(cháng)度大于8位時(shí),操作數被分為兩個(gè)以上字節存放。JVM采用了"big endian"的編碼方式來(lái)處理這種情況,即高位bits存放在低字節中。這同 Motorola及其他的RISC CPU采用的編碼方式是一致的,而與Intel采用的"little endian "的編碼方式即低位bits存放在低位字節的方法不同。

      Java指令系統是以Java語(yǔ)言的實(shí)現為目的設計的,其中包含了用于調用方法和監視多先程系統的指令。Java的8位操作碼的長(cháng)度使得JVM最多有256種指令,目前已使用了160多種操作碼。

      2.2JVM指令系統
      所有的CPU均包含用于保存系統狀態(tài)和處理器所需信息的寄存器組。如果虛擬機定義較多的寄存器,便可以從中得到更多的信息而不必對?;騼却孢M(jìn)行訪(fǎng)問(wèn),這有利于提高運行速度。然而,如果虛擬機中的寄存器比實(shí)際CPU的寄存器多,在實(shí)現虛擬機時(shí)就會(huì )占用處理器大量的時(shí)間來(lái)用常規存儲器模擬寄存器,這反而會(huì )降低虛擬機的效率。針對這種情況,JVM只設置了4個(gè)最為常用的寄存器。它們是:
      pc程序計數器
      optop操作數棧頂指針
      frame當前執行環(huán)境指針
      vars指向當前執行環(huán)境中第一個(gè)局部變量的指針
      所有寄存器均為32位。pc用于記錄程序的執行。optop,frame和vars用于記錄指向Java棧區的指針。

      2.3JVM棧結構
      作為基于棧結構的計算機,Java棧是JVM存儲信息的主要方法。當JVM得到一個(gè)Java字節碼應用程序后,便為該代碼中一個(gè)類(lèi)的每一個(gè)方法創(chuàng )建一個(gè)棧框架,以保存該方法的狀態(tài)信息。每個(gè)??蚣馨ㄒ韵氯?lèi)信息:
      局部變量
      執行環(huán)境
      操作數棧

      局部變量用于存儲一個(gè)類(lèi)的方法中所用到的局部變量。vars寄存器指向該變量表中的第一個(gè)局部變量。

      執行環(huán)境用于保存解釋器對Java字節碼進(jìn)行解釋過(guò)程中所需的信息。它們是:上次調用的方法、局部變量指針和操作數棧的棧頂和棧底指針。執行環(huán)境是一個(gè)執行一個(gè)方法的控制中心。例如:如果解釋器要執行iadd(整數加法),首先要從frame寄存器中找到當前執行環(huán)境,而后便從執行環(huán)境中找到操作數棧,從棧頂彈出兩個(gè)整數進(jìn)行加法運算,最后將結果壓入棧頂。

      操作數棧用于存儲運算所需操作數及運算的結果。

      2.4JVM碎片回收堆
      Java類(lèi)的實(shí)例所需的存儲空間是在堆上分配的。解釋器具體承擔為類(lèi)實(shí)例分配空間的工作。解釋器在為一個(gè)實(shí)例分配完存儲空間后,便開(kāi)始記錄對該實(shí)例所占用的內存區域的使用。一旦對象使用完畢,便將其回收到堆中。

      在Java語(yǔ)言中,除了new語(yǔ)句外沒(méi)有其他方法為一對象申請和釋放內存。對內存進(jìn)行釋放和回收的工作是由Java運行系統承擔的。這允許Java運行系統的設計者自己決定碎片回收的方法。在SUN公司開(kāi)發(fā)的Java解釋器和Hot Java環(huán)境中,碎片回收用后臺線(xiàn)程的方式來(lái)執行。這不但為運行系統提供了良好的性能,而且使程序設計人員擺脫了自己控制內存使用的風(fēng)險。

      2.5JVM存儲區
      JVM有兩類(lèi)存儲區:常量緩沖池和方法區。常量緩沖池用于存儲類(lèi)名稱(chēng)、方法和字段名稱(chēng)以及串常量。方法區則用于存儲Java方法的字節碼。對于這兩種存儲區域具體實(shí)現方式在JVM規格中沒(méi)有明確規定。這使得Java應用程序的存儲布局必須在運行過(guò)程中確定,依賴(lài)于具體平臺的實(shí)現方式。
 
      JVM是為Java字節碼定義的一種獨立于具體平臺的規格描述,是Java平臺獨立性的基礎。目前的JVM還存在一些限制和不足,有待于進(jìn)一步的完善,但無(wú)論如何,JVM的思想是成功的。

      對比分析:如果把Java原程序想象成我們的C++原程序,Java原程序編譯后生成的字節碼就相當于C++原程序編譯后的80x86的機器碼(二進(jìn)制程序文件),JVM虛擬機相當于80x86計算機系統,Java解釋器相當于80x86CPU。在80x86CPU上運行的是機器碼,在Java解釋器上運行的是Java字節碼。

      Java解釋器相當于運行Java字節碼的“CPU”,但該“CPU”不是通過(guò)硬件實(shí)現的,而是用軟件實(shí)現的。Java解釋器實(shí)際上就是特定的平臺下的一個(gè)應用程序。只要實(shí)現了特定平臺下的解釋器程序,Java字節碼就能通過(guò)解釋器程序在該平臺下運行,這是Java跨平臺的根本。當前,并不是在所有的平臺下都有相應Java解釋器程序,這也是Java并不能在所有的平臺下都能運行的原因,它只能在已實(shí)現了Java解釋器程序的平臺下運行。


三、Java虛擬機JVM的體系結構


      剛才已經(jīng)提到,JVM可以由不同的廠(chǎng)商來(lái)實(shí)現。由于廠(chǎng)商的不同必然導致JVM在實(shí)現上的一些不同,然而JVM還是可以實(shí)現跨平臺的特性,這就要歸功于設計JVM時(shí)的體系結構了。

      我們知道,一個(gè)JVM實(shí)例的行為不光是它自己的事,還涉及到它的子系統、存儲區域、數據類(lèi)型和指令這些部分,它們描述了JVM的一個(gè)抽象的內部體系結構,其目的不光規定實(shí)現JVM時(shí)它內部的體系結構,更重要的是提供了一種方式,用于嚴格定義實(shí)現時(shí)的外部行為。每個(gè)JVM都有兩種機制,一個(gè)是裝載具有合適名稱(chēng)的類(lèi)(類(lèi)或是接口),叫做類(lèi)裝載子系統;另外的一個(gè)負責執行包含在已裝載的類(lèi)或接口中的指令,叫做運行引擎。每個(gè)JVM又包括方法區、堆、Java棧、程序計數器和本地方法棧這五個(gè)部分,這幾個(gè)部分和類(lèi)裝載機制與運行引擎機制一起組成的體系結構圖為:


圖3JVM的體系結構

      JVM的每個(gè)實(shí)例都有一個(gè)它自己的方法域和一個(gè)堆,運行于JVM內的所有的線(xiàn)程都共享這些區域;當虛擬機裝載類(lèi)文件的時(shí)候,它解析其中的二進(jìn)制數據所包含的類(lèi)信息,并把它們放到方法域中;當程序運行的時(shí)候,JVM把程序初始化的所有對象置于堆上;而每個(gè)線(xiàn)程創(chuàng )建的時(shí)候,都會(huì )擁有自己的程序計數器和Java棧,其中程序計數器中的值指向下一條即將被執行的指令,線(xiàn)程的Java棧則存儲為該線(xiàn)程調用Java方法的狀態(tài);本地方法調用的狀態(tài)被存儲在本地方法棧,該方法棧依賴(lài)于具體的實(shí)現。

      下面分別對這幾個(gè)部分進(jìn)行說(shuō)明。

      執行引擎處于JVM的核心位置,在Java虛擬機規范中,它的行為是由指令集所決定的。盡管對于每條指令,規范很詳細地說(shuō)明了當JVM執行字節碼遇到指令時(shí),它的實(shí)現應該做什么,但對于怎么做卻言之甚少。Java虛擬機支持大約248個(gè)字節碼。每個(gè)字節碼執行一種基本的CPU運算,例如,把一個(gè)整數加到寄存器,子程序轉移等。Java指令集相當于Java程序的匯編語(yǔ)言。

      Java指令集中的指令包含一個(gè)單字節的操作符,用于指定要執行的操作,還有0個(gè)或多個(gè)操作數,提供操作所需的參數或數據。許多指令沒(méi)有操作數,僅由一個(gè)單字節的操作符構成。

      虛擬機的內層循環(huán)的執行過(guò)程如下:

 

do{

取一個(gè)操作符字節;

根據操作符的值執行一個(gè)動(dòng)作;

}while(程序未結束)

      由于指令系統的簡(jiǎn)單性,使得虛擬機執行的過(guò)程十分簡(jiǎn)單,從而有利于提高執行的效率。指令中操作數的數量和大小是由操作符決定的。如果操作數比一個(gè)字節大,那么它存儲的順序是高位字節優(yōu)先。例如,一個(gè)16位的參數存放時(shí)占用兩個(gè)字節,其值為:

      第一個(gè)字節*256+第二個(gè)字節字節碼。

      指令流一般只是字節對齊的。指令tableswitch和lookup是例外,在這兩條指令內部要求強制的4字節邊界對齊。

      對于本地方法接口,實(shí)現JVM并不要求一定要有它的支持,甚至可以完全沒(méi)有。Sun公司實(shí)現Java本地接口(JNI)是出于可移植性的考慮,當然我們也可以設計出其它的本地接口來(lái)代替Sun公司的JNI。但是這些設計與實(shí)現是比較復雜的事情,需要確保垃圾回收器不會(huì )將那些正在被本地方法調用的對象釋放掉。

      Java的堆是一個(gè)運行時(shí)數據區,類(lèi)的實(shí)例(對象)從中分配空間,它的管理是由垃圾回收來(lái)負責的:不給程序員顯式釋放對象的能力。Java不規定具體使用的垃圾回收算法,可以根據系統的需求使用各種各樣的算法。

      Java方法區與傳統語(yǔ)言中的編譯后代碼或是Unix進(jìn)程中的正文段類(lèi)似。它保存方法代碼(編譯后的java代碼)和符號表。在當前的Java實(shí)現中,方法代碼不包括在垃圾回收堆中,但計劃在將來(lái)的版本中實(shí)現。每個(gè)類(lèi)文件包含了一個(gè)Java類(lèi)或一個(gè)Java界面的編譯后的代碼??梢哉f(shuō)類(lèi)文件是Java語(yǔ)言的執行代碼文件。為了保證類(lèi)文件的平臺無(wú)關(guān)性,Java虛擬機規范中對類(lèi)文件的格式也作了詳細的說(shuō)明。其具體細節請參考Sun公司的Java虛擬機規范。

      Java虛擬機的寄存器用于保存機器的運行狀態(tài),與微處理器中的某些專(zhuān)用寄存器類(lèi)似。Java虛擬機的寄存器有四種:

      pc: Java程序計數器;

      optop: 指向操作數棧頂端的指針;

      frame: 指向當前執行方法的執行環(huán)境的指針;。

      vars: 指向當前執行方法的局部變量區第一個(gè)變量的指針。

      在上述體系結構圖中,我們所說(shuō)的是第一種,即程序計數器,每個(gè)線(xiàn)程一旦被創(chuàng )建就擁有了自己的程序計數器。當線(xiàn)程執行Java方法的時(shí)候,它包含該線(xiàn)程正在被執行的指令的地址。但是若線(xiàn)程執行的是一個(gè)本地的方法,那么程序計數器的值就不會(huì )被定義。

      Java虛擬機的棧有三個(gè)區域:局部變量區、運行環(huán)境區、操作數區。

      局部變量區

      每個(gè)Java方法使用一個(gè)固定大小的局部變量集。它們按照與vars寄存器的字偏移量來(lái)尋址。局部變量都是32位的。長(cháng)整數和雙精度浮點(diǎn)數占據了兩個(gè)局部變量的空間,卻按照第一個(gè)局部變量的索引來(lái)尋址。(例如,一個(gè)具有索引n的局部變量,如果是一個(gè)雙精度浮點(diǎn)數,那么它實(shí)際占據了索引n和n+1所代表的存儲空間)虛擬機規范并不要求在局部變量中的64位的值是64位對齊的。虛擬機提供了把局部變量中的值裝載到操作數棧的指令,也提供了把操作數棧中的值寫(xiě)入局部變量的指令。

      運行環(huán)境區

      在運行環(huán)境中包含的信息用于動(dòng)態(tài)鏈接,正常的方法返回以及異常捕捉。

      動(dòng)態(tài)鏈接

      運行環(huán)境包括對指向當前類(lèi)和當前方法的解釋器符號表的指針,用于支持方法代碼的動(dòng)態(tài)鏈接。方法的class文件代碼在引用要調用的方法和要訪(fǎng)問(wèn)的變量時(shí)使用符號。動(dòng)態(tài)鏈接把符號形式的方法調用翻譯成實(shí)際方法調用,裝載必要的類(lèi)以解釋還沒(méi)有定義的符號,并把變量訪(fǎng)問(wèn)翻譯成與這些變量運行時(shí)的存儲結構相應的偏移地址。動(dòng)態(tài)鏈接方法和變量使得方法中使用的其它類(lèi)的變化不會(huì )影響到本程序的代碼。

      正常的方法返回

      如果當前方法正常地結束了,在執行了一條具有正確類(lèi)型的返回指令時(shí),調用的方法會(huì )得到一個(gè)返回值。執行環(huán)境在正常返回的情況下用于恢復調用者的寄存器,并把調用者的程序計數器增加一個(gè)恰當的數值,以跳過(guò)已執行過(guò)的方法調用指令,然后在調用者的執行環(huán)境中繼續執行下去。

      異常捕捉

      異常情況在Java中被稱(chēng)作Error(錯誤)或Exception(異常),是Throwable類(lèi)的子類(lèi),在程序中的原因是:①動(dòng)態(tài)鏈接錯,如無(wú)法找到所需的class文件。②運行時(shí)錯,如對一個(gè)空指針的引用。程序使用了throw語(yǔ)句。

      當異常發(fā)生時(shí),Java虛擬機采取如下措施:

§ 檢查與當前方法相聯(lián)系的catch子句表。每個(gè)catch子句包含其有效指令范圍,能夠處理的異常類(lèi)型,以及處理異常的代碼塊地址。

§ 與異常相匹配的catch子句應該符合下面的條件:造成異常的指令在其指令范圍之內,發(fā)生的異常類(lèi)型是其能處理的異常類(lèi)型的子類(lèi)型。如果找到了匹配的catch子句,那么系統轉移到指定的異常處理塊處執行;如果沒(méi)有找到異常處理塊,重復尋找匹配的catch子句的過(guò)程,直到當前方法的所有嵌套的catch子句都被檢查過(guò)。

§ 由于虛擬機從第一個(gè)匹配的catch子句處繼續執行,所以catch子句表中的順序是很重要的。因為Java代碼是結構化的,因此總可以把某個(gè)方法的所有的異常處理器都按序排列到一個(gè)表中,對任意可能的程序計數器的值,都可以用線(xiàn)性的順序找到合適的異常處理塊,以處理在該程序計數器值下發(fā)生的異常情況。

§ 如果找不到匹配的catch子句,那么當前方法得到一個(gè)"未截獲異常"的結果并返回到當前方法的調用者,好像異常剛剛在其調用者中發(fā)生一樣。如果在調用者中仍然沒(méi)有找到相應的異常處理塊,那么這種錯誤將被傳播下去。如果錯誤被傳播到最頂層,那么系統將調用一個(gè)缺省的異常處理塊。

      操作數棧區

      機器指令只從操作數棧中取操作數,對它們進(jìn)行操作,并把結果返回到棧中。選擇棧結構的原因是:在只有少量寄存器或非通用寄存器的機器(如Intel486)上,也能夠高效地模擬虛擬機的行為。操作數棧是32位的。它用于給方法傳遞參數,并從方法接收結果,也用于支持操作的參數,并保存操作的結果。例如,iadd指令將兩個(gè)整數相加。相加的兩個(gè)整數應該是操作數棧頂的兩個(gè)字。這兩個(gè)字是由先前的指令壓進(jìn)堆棧的。這兩個(gè)整數將從堆棧彈出、相加,并把結果壓回到操作數棧中。

      每個(gè)原始數據類(lèi)型都有專(zhuān)門(mén)的指令對它們進(jìn)行必須的操作。每個(gè)操作數在棧中需要一個(gè)存儲位置,除了long和double型,它們需要兩個(gè)位置。操作數只能被適用于其類(lèi)型的操作符所操作。例如,壓入兩個(gè)int類(lèi)型的數,如果把它們當作是一個(gè)long類(lèi)型的數則是非法的。在Sun的虛擬機實(shí)現中,這個(gè)限制由字節碼驗證器強制實(shí)行。但是,有少數操作(操作符dupe和swap),用于對運行時(shí)數據區進(jìn)行操作時(shí)是不考慮類(lèi)型的。

      本地方法棧,當一個(gè)線(xiàn)程調用本地方法時(shí),它就不再受到虛擬機關(guān)于結構和安全限制方面的約束,它既可以訪(fǎng)問(wèn)虛擬機的運行期數據區,也可以使用本地處理器以及任何類(lèi)型的棧。例如,本地棧是一個(gè)C語(yǔ)言的棧,那么當C程序調用C函數時(shí),函數的參數以某種順序被壓入棧,結果則返回給調用函數。在實(shí)現Java虛擬機時(shí),本地方法接口使用的是C語(yǔ)言的模型棧,那么它的本地方法棧的調度與使用則完全與C語(yǔ)言的棧相同。

四、Java虛擬機JVM的運行過(guò)程

      上面對虛擬機的各個(gè)部分進(jìn)行了比較詳細的說(shuō)明,下面通過(guò)一個(gè)具體的例子來(lái)分析它的運行過(guò)程。

      虛擬機通過(guò)調用某個(gè)指定類(lèi)的方法main啟動(dòng),傳遞給main一個(gè)字符串數組參數,使指定的類(lèi)被裝載,同時(shí)鏈接該類(lèi)所使用的其它的類(lèi)型,并且初始化它們。例如對于程序:

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);

}

}

}

      編譯后在命令行模式下鍵入: java HelloApp run virtual machine

 

      將通過(guò)調用HelloApp的方法main來(lái)啟動(dòng)java虛擬機,傳遞給main一個(gè)包含三個(gè)字符串"run"、"virtual"、"machine"的數組?,F在我們略述虛擬機在執行HelloApp時(shí)可能采取的步驟。

      開(kāi)始試圖執行類(lèi)HelloApp的main方法,發(fā)現該類(lèi)并沒(méi)有被裝載,也就是說(shuō)虛擬機當前不包含該類(lèi)的二進(jìn)制代表,于是虛擬機使用ClassLoader試圖尋找這樣的二進(jìn)制代表。如果這個(gè)進(jìn)程失敗,則拋出一個(gè)異常。類(lèi)被裝載后同時(shí)在main方法被調用之前,必須對類(lèi)HelloApp與其它類(lèi)型進(jìn)行鏈接然后初始化。鏈接包含三個(gè)階段:檢驗,準備和解析。檢驗檢查被裝載的主類(lèi)的符號和語(yǔ)義,準備則創(chuàng )建類(lèi)或接口的靜態(tài)域以及把這些域初始化為標準的默認值,解析負責檢查主類(lèi)對其它類(lèi)或接口的符號引用,在這一步它是可選的。類(lèi)的初始化是對類(lèi)中聲明的靜態(tài)初始化函數和靜態(tài)域的初始化構造方法的執行。一個(gè)類(lèi)在初始化之前它的父類(lèi)必須被初始化。整個(gè)過(guò)程如下:


本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
操作系統內存與JVM內存
Java中JVM虛擬機詳解
2萬(wàn)字長(cháng)文包教包會(huì ) JVM 內存結構 保姆級學(xué)習筆記
深入java虛擬機第5章, 棧
Java虛擬機 JVM的介紹
Java虛擬機規范
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久