導航:首頁 > 源碼編譯 > java虛擬機編譯技術

java虛擬機編譯技術

發布時間:2022-04-16 19:40:23

1. 什麼是 java 虛擬機

您好,提問者:

Java虛擬機簡稱JVM,它的作用如下:

1、其實Java不可跨平台,真正實現跨平台的是JVM虛擬機。

2、JVM其實就是一個編譯java、運行class的一個跟操作系統的一個軟體。

3、JVM的作用只針對於Java,而系統中的東西與它無關。

4、其實說白了就是一個軟體,就像VMware一樣。

Java虛擬機


一、什麼是Java虛擬機


Java虛擬機是一個想像中的機器,在實際的計算機上通過軟體模擬來實現。Java虛擬機有自己想像中的硬體,如處理器、堆棧、寄存器等,還具有相應的指令系統。


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

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


2.誰需要了解Java虛擬機


Java虛擬機是Java語言底層實現的基礎,對Java語言感興趣的人都應對Java虛擬機有個大概的了解。這有助於理解Java語言的一些性質,也有助於使用Java語言。對於要在特定平台上實現Java虛擬機的軟體人員,Java語言的編譯器作者以及要用硬體晶元實現Java虛擬機的人來說,則必須深刻理解Java虛擬機的規范。另外,如果你想擴展Java語言,或是把其它語言編譯成Java語言的位元組碼,你也需要深入地了解Java虛擬機。


3.Java虛擬機支持的數據類型


Java虛擬機支持Java語言的基本數據類型如下:


byte://1位元組有符號整數的補碼

short://2位元組有符號整數的補碼

int://4位元組有符號整數的補碼

long://8位元組有符號整數的補碼

float://4位元組IEEE754單精度浮點數

double://8位元組IEEE754雙精度浮點數

char://2位元組無符號Unicode字元


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


虛擬機支持的其它數據類型包括:

object//對一個Javaobject(對象)的4位元組引用

returnAddress//4位元組,用於jsr/ret/jsr-w/ret-w指令

注:Java數組被當作object處理。


虛擬機的規范對於object內部的結構沒有任何特殊的要求。在Sun公司的實現中,對object的引用是一個句柄,其中包含一對指針:一個指針指向該object的方法表,另一個指向該object的數據。用Java虛擬機的位元組碼表示的程序應該遵守類型規定。Java虛擬機的實現應拒絕執行違反了類型規定的位元組碼程序。Java虛擬機由於位元組碼定義的限制似乎只能運行於32位地址空間的機器上。但是可以創建一個Java虛擬機,它自動地把位元組碼轉換成64位的形式。從Java虛擬機支持的數據類型可以看出,Java對數據類型的內部格式進行了嚴格規定,這樣使得各種Java虛擬機的實現對數據的解釋是相同的,從而保證了Java的與平台無關性和可

移植性。


二、Java虛擬機體系結構


Java虛擬機由五個部分組成:一組指令集、一組寄存器、一個棧、一個無用單元收集堆(Garbage-collected-heap)、一個方法區域。這五部分是Java虛擬機的邏輯成份,不依賴任何實現技術或組織方式,但它們的功能必須在真實機器上以某種方式實現。


  1. Java指令集

Java虛擬機支持大約248個位元組碼。每個位元組碼執行一種基本的CPU運算,例如,把一個整數加到寄存器,子程序轉移等。Java指令集相當於Java程序的匯編語言。

Java指令集中的指令包含一個單位元組的操作符,用於指定要執行的操作,還有0個或多個操作數,提供操作所需的參數或數據。許多指令沒有操作數,僅由一個單位元組的操作符構成。


虛擬機的內層循環的執行過程如下:


do{

取一個操作符位元組;

根據操作符的值執行一個動作;

}while(程序未結束)


由於指令系統的簡單性,使得虛擬機執行的過程十分簡單,從而有利於提高執行的效率。指令中操作數的數量和大小是由操作符決定的。如果操作數比一個位元組大,那麼它存儲的順序是高位位元組優先。例如,一個16位的參數存放時佔用兩個位元組,其值為:


第一個位元組*256+第二個位元組位元組碼指令流一般只是位元組對齊的。指令tabltch和lookup是例外,在這兩條指令內部要求強制的4位元組邊界對齊。


2.寄存器


Java虛擬機的寄存器用於保存機器的運行狀態,與微處理器中的某些專用寄存器類似。


Java虛擬機的寄存器有四種:

pc:Java程序計數器。

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

frame:指向當前執行方法的執行環境的指針。

vars:指向當前執行方法的局部變數區第一個變數的指針。


Java虛擬機


Java虛擬機是棧式的,它不定義或使用寄存器來傳遞或接受參數,其目的是為了保證指令集的簡潔性和實現時的高效性(特別是對於寄存器數目不多的處理器)。

所有寄存器都是32位的。


3.棧


Java虛擬機的棧有三個區域:局部變數區、運行環境區、操作數區。


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


(2)運行環境區 在運行環境中包含的信息用於動態鏈接,正常的方法返回以及異常傳播。


·動態鏈接

運行環境包括對指向當前類和當前方法的解釋器符號表的指針,用於支持方法代碼的動態鏈接。方法的class文件代碼在引用要調用的方法和要訪問的變數時使用符號。動態鏈接把符號形式的方法調用翻譯成實際方法調用,裝載必要的類以解釋還沒有定義的符號,並把變數訪問翻譯成與這些變數運行時的存儲結構相應的偏移地址。動態鏈接方法和變數使得方法中使用的其它類的變化不會影響到本程序的代碼。


·正常的方法返回

如果當前方法正常地結束了,在執行了一條具有正確類型的返回指令時,調用的方法會得到一個返回值。執行環境在正常返回的情況下用於恢復調用者的寄存器,並把調用者的程序計數器增加一個恰當的數值,以跳過已執行過的方法調用指令,然後在調用者的執行環境中繼續執行下去。


·異常和錯誤傳播

異常情況在Java中被稱作Error(錯誤)或Exception(異常),是Throwable類的子類,在程序中的原因是:①動態鏈接錯,如無法找到所需的class文件。②運行時錯,如對一個空指針的引用


·程序使用了throw語句。

當異常發生時,Java虛擬機採取如下措施:

·檢查與當前方法相聯系的catch子句表。每個catch子句包含其有效指令范圍,能夠處理的異常類型,以及處理異常的代碼塊地址。

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

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

·如果找不到匹配的catch子句,那麼當前方法得到一個"未截獲異常"的結果並返回到當前方法的調用者,好像異常剛剛在其調用者中發生一樣。如果在調用者中仍然沒有找到相應的異常處理塊,那麼這種錯誤傳播將被繼續下去。如果錯誤被傳播到最頂層,那麼系統將調用一個預設的異常處理塊。

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


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


4.無用單元收集堆


Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java語言具有無用單元收集能力:它不給程序員顯式釋放對象的能力。Java不規定具體使用的無用單元收集演算法,可以根據系統的需求使用各種各樣的演算法。


5.方法區


方法區與傳統語言中的編譯後代碼或是Unix進程中的正文段類似。它保存方法代碼(編譯後的java代碼)和符號表。在當前的Java實現中,方法代碼不包括在無用單元收集堆中,但計劃在將來的版本中實現。每個類文件包含了一個Java類或一個Java界面的編譯後的代碼。可以說類文件是Java語言的執行代碼文件。為了保證類文件的平台無關性,Java虛擬機規范中對類文件的格式也作了詳細的說明。其具體細節請參考Sun公司的Java虛擬機規范。

2. Java的核心技術什麼

第一:Java虛擬機 Java虛擬機的主要任務是裝在class文件並且執行其中的位元組碼。Java虛擬機包含一個類裝載器,它可以從程序和API中裝載class文件。Java API中只有程序執行時需要的那些類才會被裝載。位元組碼由執行引擎來執行。不同的Java虛擬機中,執行引擎可能實現得非常不同。在由軟體實現的虛擬機中,最簡單的執行引擎就是一次性解釋位元組碼。另一種執行引擎更快,但是也更消耗內存,叫做"即時編譯器(just-in-time compiler)"。在這種情況下,第一次被執行的位元組碼會被編譯成本地機器代碼。編譯出的本地機器代碼會被緩存,當方法以後被調用的時候可以重用。第三種執行引擎是自適應優化器。在這種方法里,虛擬機開始的時候解釋位元組碼,但是會監視運行中程序的活動,並且記錄下使用最頻繁的代碼段。程序運行的時候,虛擬機只把那些活動最頻繁的代碼編譯成本地代碼,其他的代碼由於使用得不是很頻繁,繼續保留為位元組碼-由虛擬機繼續解釋它們。一個自適應的優化器可以使得Java虛擬機在80%~90%的時間里執行被優化過的本地代碼,而只需要編譯10%~20%的對性能有影響的代碼。 當Java虛擬機是由主機操作系統上的軟體實現的時候,Java程序通過調用本地方法(native method)和主機交互。Java中有兩種方法: Java方法和本地方法。Java方法是由Java語言編寫,編譯成位元組碼文件,存儲在class文件中的。本地方法是由其他語言(比如c,c++或匯編語言)編寫的,編譯成何處理器相關的機器代碼。本地方法保存在動態鏈接庫中,格式是各個平台專有的。運行中Java程序調用本地方法時,虛擬機裝載包含這個本地方法的動態庫,並調用這個方法。本地方法是聯系Java程序和底層主機操作系統的連接方法。
第二:類裝載器的體系結構 一個Java應用程序可以使用兩種類裝載器:"啟動(bootstrap)"類裝載器和用戶定義的類裝載器。啟動類裝載器(這是系統中唯一的)是Java虛擬機實現的一部分。啟動類裝載器通常使用某種默認方式從本地磁碟中裝載類,包括Java API類(啟動類裝載器也被稱為原始類裝載器、系統類裝載器或者默認類裝載器)。 Java應用程序能夠在運行時安裝用戶定義的類裝載器,這種類裝載器能夠使用自定義的方式來裝載類。例如,從網路下載class文件。盡管啟動類裝載器是虛擬機實現的本質部分,而用戶定義的類裝載器不是,但用戶定義的類裝載器能夠用Java來編寫,能夠被編譯成class文件,能夠被虛擬機裝載,還能夠像其它對象一樣實例化。 由於有用戶定義類裝載器,所以不必再編譯的時候就知道運行中的Java應用程序中最終會加入的所有的類。用戶定義的類裝載器使得在運行擴展Java應用程序成為可能。當它運行時,應用程序能夠解決它需要哪些額外的類,能夠決定是使用一個或是更多的用戶定義的類裝載器來裝載。由於類裝載器是用Java編寫的,所以用任何在Java代碼中可以表述的風格來進行類裝載。這些類可以通過網路下載,可以從某些資料庫中獲取,甚至可以動態生成。 每一個類被裝載的時候,Java虛擬機都監視這個類,看到它到底是被啟動類裝載器還是被用戶定義類裝載器裝載。當被裝載的類引用了另外一個類時,虛擬機就會使用裝載第一個類的類裝載器裝載引用的類。例如,如果虛擬機使用一個特定的類裝載器裝載Volcano這個類,它就會使用這個類裝載器裝載Volcano類使用的所有類。 由於Java虛擬機採取這種方式進行類的裝載,所以被裝載的類默認情況下只能看到被同一個類裝載器裝載的別的類。通過這種方法,Java的體系結構允許在一個Java應用程序中建立多個命名空間。運行時的Java程序中的每一個類裝載器都有自己的命名空間。 Java應用程序可以創建多少個(或多少種)被不同的類裝載器裝載的類存放在不同的命名空間中,它們不能相互訪問,除非應用程序顯示地允許這么做。當編寫一個Java應用程序的時候,從不同源文件裝載的類可以分隔在不同的命名空間中。通過這種方法,就能夠使用Java類裝載器的體系結構來控制任何不同源文件中裝載的代碼之間的相互影響,特別是能夠阻止惡意代碼獲取訪問或破壞善意代碼的許可權。 Web瀏覽器是一個動態擴展的例子,Web瀏覽器使用用戶定義的類裝載器從網路下載用於Java applet的class文件。Web瀏覽器使用一個用來安裝用戶定義類裝載器的Java應用程序。這個用戶定義的類裝載器通常被稱為Java Applet類裝載器,它知道如何向HTTP伺服器請求class文件。Java Applet可以作為動態擴展的例子,因為Java應用程序並不知道它什麼時候會開始從網路下載瀏覽器請求的class文件。只有當瀏覽器遇到有Java applet的頁面時,才決定是否需要下載class文件。 Web瀏覽器啟動的Java應用程序通常為每個提供class文件的網路地址分別創建不同的用戶定義類裝載器,因此,不同的用戶定義類裝載器裝載不同來源的class文件。這就可以把它們分別放置在Java主機應用程序的不同命名空間之下。由於不同來源的Java applet文件放置在不同的命名空間中,惡意的Java applet代碼就不會直接訪問從別的地方下載的class文件。這就能夠限制或阻止不同來源的代碼之間的相互訪問。
第三:Java class文件 Java class文件主要在平台無關性和網路移動性方面使Java更適合網路。它在平台無關性方面的任務是:為Java程序提供獨立於底層主機平台的二進制形式的服務。這種途徑途徑打破了C或者C++等語言所遵循的傳統,使用這些傳統語言寫的程序通常首先被編譯,然後被連接成單獨的、專門支持特定硬體平台和操作系統的二進制文件。通常情況下,一個平台上的二進制可執行文件不能在其他平台上工作。而Java class文件時可以運行在任何支持Java虛擬機的硬體平台和操作系統上的二進制文件。 當編譯和連接一個C++程序時,所獲得的可執行二進制文件只能在指定的硬體平台和操作系統上運行,因為這個二進制文件包含了對目標處理器的機器語言。而Java編譯器把Java源文件的指令翻譯成位元組碼,這種位元組碼就是Java虛擬機的"機器語言"。class文件設計得緊湊,因此它們可以快速地在網路上傳送。其次,由於Java程序是動態連接和動態擴展的,class文件可以在需要的時候才下載。這個特點使得Java應用程序能夠安排從網路上下載class文件的時間,從而可以最大限度地減少終端用戶的等待時間。
第四:Java API Java API通過支持平台無關性和安全性,使得Java適應於網路應用。Java API是運行庫的集合,它提供了一套訪問主機系統資源的標准方法。運行Java程序時,虛擬機裝載程序的class文件所使用的Java API class文件。所有被裝載的class文件(包括從應用程序中和從Java API中提取的)和所有已經裝載的動態庫(包含本地方法)共同組成了再Java虛擬機上運行的整個程序。 在一個平台能偶支持Java程序以前,必須在這個特定平台上明確地實現API的功能。為訪問主機上的本地資源,Java API調用了本地方法。由於Java API class文件調用了本地方法,Java程序就不需要再調用它們了。通過這種方法,Java API class文件為底層主機提供了具有平台無關性、標准介面的Java程序。對Java程序而言,無論平台內部如何,Java API都會有同樣的表現和可預測的行為。正是由於在每個特定的主機平台上明確地實現了Java虛擬機和Java API,因此,Java程序自身就能夠成為具有平台無關性的程序。 Java API在Java安全性模型方面也有貢獻。當Java API的方法進行任何有潛在危險的操作(比如進行本地磁碟寫操作)之前,都會通過查詢訪問控制器來檢驗是否得到了授權。訪問控制器是一個類,該類用來執行棧檢驗,已決定是否允許某種操作。

3. Java的核心技術有哪些

4. 什麼是Java虛擬機

虛擬機是一種抽象化的計算機,通過在實際的計算機上模擬模擬各種計算機功能來實現的。

Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM屏蔽了與具體操作系統平台相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平台上不加修改地運行。

這種解釋應該算是正確的,但是只描述了虛擬機的外部行為和功能,並沒有針對內部原理做出說明。一般情況下我們不需要知道虛擬機的運行原理,只要專注寫java代碼就可以了,這也正是虛擬機之所以存在的原因--屏蔽底層操作系統平台的不同並且減少基於原生語言開發的復雜性,使java這門語言能夠跨各種平台(只要虛擬機廠商在特定平台上實現了虛擬機),並且簡單易用。這些都是虛擬機的外部特性,但是從這些信息來解釋虛擬機,未免太籠統了,無法讓我們知道內部原理。


從進程的角度解釋JVM


讓我們嘗試從操作系統的層面來理解虛擬機。我們知道,虛擬機是運行在操作系統之中的,那麼什麼東西才能在操作系統中運行呢?當然是進程,因為進程是操作系統中的執行單位。可以這樣理解,當它在運行的時候,它就是一個操作系統中的進程實例,當它沒有在運行時(作為可執行文件存放於文件系統中),可以把它叫做程序。

命令行比較熟悉的同學,都知道其實一個命令對應一個可執行的二進制文件,當敲下這個命令並且回車後,就會創建一個進程,載入對應的可執行文件到進程的地址空間中,並且執行其中的指令。下面對比C語言和Java語言的HelloWorld程序來說明問題。

首先編寫C語言版的HelloWorld程序。

總結

寫到這里,基本上關於我對java虛擬機的理解就寫完了。這篇文章的主題雖然是深入理解Java虛擬機,但是你可能感覺一點也不「深入」,也只是泛泛而談。我也有這樣的感覺。限於自己水平有限,也只能這樣了,要是想深入理解java虛擬機,強烈建議讀一下三本書:

《深入Java虛擬機》

《深入理解Java虛擬機JVM高級特性與最佳實踐》

《Java虛擬機規范》

其實我也讀過這幾本書,但是它們對虛擬機的解釋也是基於一個外部模型,而沒有深入剖析虛擬機內部的實現原理。虛擬機是一個大而復雜的東西,實現虛擬機的人都是大牛級別的,如果不是參與過虛擬機的實現,應該很少有人能把它參透。本專欄後面的一些文章也參考了這三本書, 雖然講解Java語法的書不計其數, 但是深入講解虛擬機的書, 目前為止我就見過這三本,並且網上的資料也不是很多。

最後做一個總結:

1 虛擬機並不神秘,在操作系統的角度看來,它只是一個普通進程。

2 這個叫做虛擬機的進程比較特殊,它能夠載入我們編寫的class文件。如果把JVM比作一個人,那麼class文件就是我們吃的食物。

3 載入class文件的是一個叫做類載入器的子系統。就好比我們的嘴巴,把食物吃到肚子里。

4 虛擬機中的執行引擎用來執行class文件中的位元組碼指令。就好比我們的腸胃,對吃進去的食物進行消化。

5 虛擬機在執行過程中,要分配內存創建對象。當這些對象過時無用了,必須要自動清理這些無用的對象。清理對象回收內存的任務由垃圾收集器負責。就好比人吃進去的食物,在消化之後,必須把廢物排出體外,騰出空間可以在下次餓的時候吃飯並消化食物。

(4)java虛擬機編譯技術擴展閱讀:

關於JAVA虛擬機的參數說明如下:

1、運行class文件

執行帶main方法的class文件,Java虛擬機[3]命令參數行為:

java <CLASS文件名>

注意:CLASS文件名不要帶文件後綴.class

例如:

java Test

如果執行的class文件是帶包的,即在類文件中使用了:

package <;包名>

那應該在包的基路徑下執行,Java虛擬機命令行參數:

java <;包名>.CLASS文件名

例如:

PackageTest.java中,其包名為:com.ee2ee.test,對應的語句為:

package com.ee2ee.test;

PackageTest.java及編譯後的class文件PackageTest.class的存放目錄如下:

classes

|__com

|__ee2ee

|__test

|__PackageTest.java

|__PackageTest.class

要運行PackageTest.class,應在classes目錄下執行:

java com.ee2ee.test.PackageTest

2、運行jar文件中的class

原理和運行class文件一樣,只需加上參數-cp <jar文件名>;即可。

例如:執行test.jar中的類com.ee2ee.test.PackageTest,命令行如下:

java -cp test.jar com.ee2ee.test.PackageTest

3、顯示JDK版本信息

當一台機器上有多個jdk版本時,需要知道當前使用的是那個版本的jdk,使用參數-version即可知道其版本,命令行為:

java -version

4、增加虛擬機可以使用的最大內存

Java虛擬機可使用的最大內存是有限制的,預設值通常為64MB或128MB。

如果一個應用程序為了提高性能而把數據載入內存中而佔用較大的內存,比如超過了默認的最大值128MB,需要加大java虛擬機可使用的最大內存,否則會出現Out of Memory的異常。啟動java時,需要使用如下兩個參數:

-Xms java虛擬機初始化時使用的內存大小

-Xmx java虛擬機可以使用的最大內存

以上兩個命令行參數中設置的size,可以帶單位,例如:256m表示256MB

舉例說明:

java -Xms128m -Xmx256m ...

表示Java虛擬機初始化時使用的內存為128MB,可使用的最大內存為256MB。

對於tomcat,可以修改其腳本catalina. sh(Unix平台)或catalina.bat(Windows平台),設置變數JAVA_OPTS即可,例如:

JAVA_OPTS='-Xms128m -Xmx256m'



5. java編譯器和java虛擬機的關系

java編譯器是開發java程序用的
java虛擬機是java跨平台的解釋java程序和運行java程序用的

6. java虛擬機工作原理

從宏觀上介紹一下Java虛擬機的工作原理。從最初編寫的Java源文件(.java文件)是如何一步步執行的,如下圖所示,首先Java源文件經過前端編譯器(javac或ECJ)將.java文件編譯為Java位元組碼文件,然後JRE載入Java位元組碼文件,載入系統分配給JVM的內存區,然後執行引擎解釋或編譯類文件,再由即時編譯器將位元組碼轉化為機器碼。主要介紹下圖中的類載入器和運行時數據區兩個部分。

7. 求Java虛擬機詳解

1 Java技術與Java虛擬機

說起Java,人們首先想到的是Java編程語言,然而事實上,Java是一種技術,它由四方面組成:Java編程語言、Java類文件格式、Java虛擬機和Java應用程序介面(JavaAPI)。它們的關系如下圖所示:

圖4:虛擬機的運行過程

4 結束語

本文通過對JVM的體系結構的深入研究以及一個Java程序執行時虛擬機的運行過程的詳細分析,意在剖析清楚Java虛擬機的機理。

8. java虛擬機和java編譯器是什麼關系和區別 他倆分別是干什麼的

編譯器就是把java源代碼編譯成位元組碼。java不生成exe的,保證了跨平台性。這個位元組碼就可以運行在java的虛擬機上java virtual machine

9. java的虛擬機 編譯器 解釋器 都什麼關系啊

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

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

Java虛擬機是一個想像中的機器,在實際的計算機上通過軟體模擬來實現。Java虛擬機有自己想像中的硬體,如處理器、堆棧、寄存器等,還具有相應的指令系統。

參考:http://ke..com/view/374952.htm

Javac編譯器

Javac編譯器讀取Java源代碼,並將其編譯成位元組代碼,調用Javac的命令行示例如下:

C:>javac options filename.java

值得注重的是,和Java解釋器不同,Javac 編譯器期望它正在編譯的文件具有擴展名.java。其命令行如下表 選項 功能

-classpath path 此選項用於設定路徑,在該路徑上Javac尋找需被調用的類。該路徑是一個用分號分開的目錄列表。

-d Directory 此選項指定一個根目錄。該目錄用來創建反映軟體包繼續關系的目錄數。

-g 此選項在代碼產生器中打開調試表,以後可憑此調試產生位元組代碼。

-nowarn 此選項禁止編譯器產生警告。

-o 此選項告訴javac優化由內聯的static、final以及privite成員函數所產生的碼。

-verbose 此選項告知Java顯示出有關被編譯的源文件和任何被調用類庫的信息。

參考:http://ke..com/view/2972115.htm


10. JAVA虛擬機是什麼意思

Java虛擬機(Java Virtual Machine,簡稱JVM)是一種假想的計算機。從結構上看,它由抽象的指令集、寄存器組、類文件格式規定、堆棧、內存垃圾收集器和存儲區六個部件組成。指令集採用與平合無關的位元組碼形式,寄存器組中包含程序計數器、堆棧指針、運行環境指針和變數指針,類文件也與平台無關,堆棧用來傳遞參數和返回運行結果,垃圾收集器收集不再使用的內存片段,存儲區則用來存放位元組碼。JVM僅僅規定部件的功能和規格。雖然這些功能和規格是統一的,但是並沒有規定這此部件的具體實現技術,就是說,可以用任何一種技術來實現。

Java中引入了虛擬機的概念,即在機器和編譯程序之間加入了一層抽象的虛擬的機器。這台虛擬的機器在任何平台上都提供給編譯程序一個的共同的介面。編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然後由解釋器來將虛擬機代碼轉換為特定系統的機器碼執行。在Java中,這種供虛擬機理解的代碼叫做位元組碼(ByteCode),它不面向任何特定的處理器,只面向虛擬機。

每一種平台的解釋器是不同的,但是實現的虛擬機是相同的。Java源程序經過編譯器編譯後變成位元組碼,位元組碼由虛擬機解釋執行,虛擬機將每一條要執行的位元組碼送給解釋器,解釋器將其翻譯成特定機器上的機器碼,然後在特定的機器上運行。

可以說,Java虛擬機是Java語言的基礎。它是Java技術的重要組成部分。Java虛擬機是一個抽象的計算機,和實際的計算機一樣,它具有一個指令集並使用不同的存儲區域。它負責執行指令,還要管理數據、內存和寄存器。Java解釋器負責將位元組代碼翻譯成特定機器的機器代碼。Java是一種簡單的語言。它用到的概念不多,而且多為程序員所熟悉。如果你是一名程序員,掌握Java對你來說是易如反掌的事。即使你沒有學過任何編程語言,學習Java也要比學習C++要容易的多。

閱讀全文

與java虛擬機編譯技術相關的資料

熱點內容
cs社區伺服器怎麼改中文 瀏覽:23
360手機取消加密 瀏覽:962
python矩陣橫向求和 瀏覽:635
台灣伺服器主板廠商有哪些雲主機 瀏覽:81
php代碼部署到雲伺服器 瀏覽:724
本地伺服器怎麼打個人網站 瀏覽:131
用姓做個特效用哪個app 瀏覽:782
安卓faceme酷臉怎麼打開 瀏覽:290
python矩陣的運算符 瀏覽:800
程序員進公司干什麼 瀏覽:973
socket發數據java 瀏覽:566
上傳圖片伺服器開小差是什麼意思 瀏覽:785
pdf文件怎麼轉換為ppt文件 瀏覽:858
web前端開發與java 瀏覽:737
安卓如何卸載軟體 瀏覽:500
linux如何查看伺服器型號 瀏覽:282
php新建一個對象 瀏覽:682
滴滴加密錄像投訴 瀏覽:979
word兼容pdf 瀏覽:643
阿里雲輕量應用伺服器怎麼買 瀏覽:571