java虛擬機動態類型語言支持(java虛擬機的特性)

本文目錄一覽:

什麼是 Java 虛擬機?

您好,提問者:

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

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

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

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

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

Java虛擬機

一、什麼是Java虛擬機

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

為什麼要使用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虛擬機的邏輯成份,不依賴任何實現技術或組織方式,但它們的功能必須在真實機器上以某種方式實現。

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的虛擬機實現中,這個限制由字節碼驗證器強制實行。但是,有少數操作(操作符dupe和swap),用於對運行時數據區進行操作時是不考慮類型的。

4.無用單元收集堆

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

5.方法區

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

Java 和 Python 有哪些區別

Java PK Python

Java是一種面向對象語言,具有許多程序員熟悉的類似於C / C ++的語法。其吸引力和價值所在是其具有的可移植性和相對效率。Java作為一種編譯語言,執行模式與解釋性語言(比如Python和Perl)相比更加以機器為中心。Java不僅僅是一種語言和庫:它也是一個虛擬機,一個生態系統。Java虛擬機(JVM)是運行Java代碼的理想化和便攜式平台。程序員不必擔心硬件細節,並且不必將代碼移植到新平台,Java承諾“一次寫入,到處編譯(WORA)”。同時,JVM語言有很多,比如Groovy、Clojure、Scala、Python或者Jython。

Python起源於一種腳本語言,它的語法體現了一種可讀性的理念,具有簡單而規則的界限,鼓勵簡潔和一致的代碼布局。Python的參考實現(以C編寫,被稱為CPython)在許多平台上可用,並且是眾多實現中最常用的。Python的動態類型有助於代碼簡化和組合,是許多平台的解釋性語言,成為眾多程序員編程首選的便攜式選項。Python是圍繞可擴展對象模型構建的通用語言。其面向對象的核心並不意味着對象定向是開發人員在用Python編程時最常用的方式。它支持程序化編程,模塊化編程和部分函數式編程。

Java PK Python之一:速度

在網絡I / O成本或數據庫訪問佔主導地位的情況下,語言的具體效率不如技術選擇和設計方面的整體效率重要。Java和Python都不適合高性能計算,但在性能上,Java還是略勝一籌。雖然一些Python實現(如PyPy)可以針對性能進行微調,但原始的便攜式性能Python不佔優勢。

Java的效率優勢體現在虛擬機執行。程序執行時,JVM可以將字節碼轉換為本地機器碼。這種即時(JIT)編譯讓Java的性能略勝Python。Java從其第一個公開版本起就支持並發,而Python則是按序執行。在當前多核處理的趨勢下,Java代碼更易實現。

Java PK Python之二:實用敏捷性

漫長的發展中,Java和Python都受益匪淺。Java通常被認為與敏捷開發及其社區有更密切的聯繫。Python在敏捷領域一直存在,並且受到諸多原因的影響而更加普及,包括DevOps運動的興起。

Java比Python具備更一致的重構支持,一方面,它的靜態類型使自動化重構更可預測和可靠,另一方面是Java開發中IDE(例如IntelliJ,Eclipse和NetBeans)的普及。Python的動態類型在代碼中鼓勵使用不同類型的敏捷性,其重點在於簡潔和流動。然而,Pythonic文化傾向於多種編輯器,而不是基於IDE,這意味着對強自動重構的支持較低。

JUnit的早期知名度及其與測試驅動開發(TDD)的關聯意味着,在所有語言中,Java可能是唯一一個單元測試受到程序員一致歡迎的語言。在IDE中自動包含JUnit已經在很大程度上對此有所幫助了。

Python的腳本起源和在其標準庫中包含測試功能意味着Python對現代開發中自動化測試相當重視,儘管它更有可能是集成而不是單元測試。在Java世界中,傳統Java代碼庫可以通過採用另一種JVM語言來加以改善,例如使用Groovy或Clojure進行自動化測試,或者完全跨越Java Universe,例如使用Python來處理系統方面操作 。

Java PK Python之三:架構

圍繞Python Web框架構思的軟件體系架構與Java的不會相差甚遠。Java和Python都有各自的開源社區,並有很多程序員一直在源源不斷的貢獻源代碼,這些代碼已經解決了常見或者不常見的問題,事實上,這兩種語言都因開源社區而受益匪淺。

Java PK Python之四:歷史遺留問題

歷史遺留問題在其技術上具有慣性。當企業選擇了一種編程語言,就很難再次更換。例如,更多的企業項目後端可能會使用Java代碼來擴展其功能,也許可以遷移到更新版本的語言,或者通過其他JVM語言(如Scala和Groovy)添加新功能。Java在企業中的歷史比Python更久,這也是招聘Java程序員的企業比招Python更多的原因。

Java PK Python之五:市場普及度

Java和Python都是TIOBE編程語言排行榜上的前十名,並且是穩穩地佔據前十名。 但Java一直比Python更受歡迎,但是Python的受歡迎程度已經超過了兩種編程語言:Perl和Ruby。

此外,兩種語言在教育中都具有強大的立足點,但Java比Python更常用於大學課程中。

結論

Java和Python都是富有活力的編程語言,這兩種語言與開放性相關聯,所以公司,團隊和程序員在做出決定時最好保持開放的態度。

什麼叫虛擬機?

什麼是虛擬機?

虛擬機的概念比較寬泛,通常人們接觸到的虛擬機概念有VMware那樣的硬件模擬軟件,也有JVM這樣的介於硬件和編譯程序之間的軟件。這裡所指的是後者。

虛擬機是一個抽象的計算機,和實際的計算機一樣,具有一個指令集並使用不同的存儲區域。它負責執行指令,還要管理數據、內存和寄存器。這台虛擬的機器在任何平台上都提供給編譯程序一個的共同的接口。編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然後由解釋器來將虛擬機代碼轉換為特定系統的機器碼執行。

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的虛擬機實現中,這個限制由字節碼驗證器強制實行。但是,有少數操作(操作符dupe和swap),用於對運行時數據區進行操作時是不考慮類型的。

4.無用單元收集堆

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

5.方法區

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

北大青鳥java培訓:為什麼要學習java虛擬機的使用?

隨着互聯網編程開發行業的不斷發展,越來越多的編程開發語言被程序員所掌握。

今天,廣東java培訓就一起來了解一下,在學習java編程開發語言的時候,java虛擬機的存在有什麼作用。

程序員之間的語言之爭又未嘗不是如此。

寫系統語言的鄙視託管語言那低下的執行效率;寫託管語言的則取笑系統語言需要手動管理內存;寫動態語言的不屑於靜態語言那冗餘的類型系統;寫靜態語言的則嘲諷動態語言裡邊各種光怪陸離的運行時錯誤。

Java作為應用廣的語言,自然吸引了不少的攻擊,而身為Java程序員的你,或許在口水戰中落了下風,忿忿於沒有足夠的知識武裝自己;又或許想要深入學習Java語言,卻又無從下手。

甚至是在實踐中被Java的啟動性能、內存耗費所震驚,因此對Java語言本身產生了種種的懷疑與顧慮。

不過別擔心,學習Java虛擬機,就可以解答你對Java的種種疑慮,做到“知其所以然”——了解Java程序是如何被執行且優化的。

這樣一來,你才可以從內部入手,達到高效編程的目的。

與此同時,你也可以為學習更深層級、更為核心的Java技術打好基礎。

如果我們把核心類庫的API比做數學公式的話,那麼Java虛擬機的知識就好比公式的推導過程。

掌握數學公式固然可以應付考試,但是了解背後的推導過程更加有助於記憶和理解。

並且,在遇到那些沒法套公式的情況下,我們也能知道如何解決。

Java的特點有哪些?

Java是一種優秀的程序設計語言,它具有令人賞心悅目的語法和易於理解的語義。不僅如此,Java還是一個由一系列計算機軟件和規範形成的技術體系,這個技術體系提供了完整的用於軟件開發和跨平台部署的支持環境,並廣泛應用於嵌入式系統、移動終端、企業服務器、大型機等各種場合。順便說一下,JavaScript和Java沒有任何關係,最開始JavaScript叫liveScript,當時Java太火了,於是乎 liveScript更名為JavaScript借勢宣傳了一波。

   隨便搜搜近幾年的編程類語言排行榜,Java絕對都是當之無愧的老大哥。那麼,Java究竟有什麼特性能獲得 廣大程序員的一致青睞呢? 在此列出java的11個特性:

1.簡單性

Java語法是C++語法的一個“純凈版本”。這裡沒有頭文件,指針運算(甚至指針語法),結構,聯合,操作符重載,虛基類等等。不僅如此,Java開發環境遠遠超出大多數其他編程語言的開發環境。

2.面向對象

 什麼是面向對象?用木匠打一個比方,一個“面向對象”的木匠始終關注的是所製作的椅子,第二位才是所使用的工具;而一個“非面向對象”木匠首先考慮的是所使用的工具。

 在Java的世界裡,一切皆對象。

 Java的面向對象特性與C++旗鼓相當,與C++不同的點在於多重繼承。在Java中,取而代之的是更簡單的接口概念。而且與C++想比,Java提供了更豐富非運行時自省功能。

3.分布式(微服務)

  Java有豐富的例程庫,用於處理HTTP和FTP之類的TCP/IP協議。Java應用程序能夠通過URL打開和訪問網絡上的對象,其便捷程度就好像訪問本地文件一樣。

4.健壯性

  Java與C++最大的不同在於Java使用的指針模型可以消除重寫內存和損壞數據的可能性(對於曾經花費幾個小時來檢查由於指針bug而引起內存衝突的人來說,一定很喜歡Java的這一特性)。不僅如此,Java編譯器能夠檢測許多在其他語言中僅在運行時才能夠檢測出來的問題。

5.安全性

  Java適用於網絡/分式式環境。為了達到這個目標,在安全性方面投入了大量的精力。使用Java可以構建防病毒,防篡改的系統。

從一開始,Java就設計出能夠防範常見的各種攻擊:

(1)運行時堆棧溢出。蠕蟲和病毒常用的攻擊手段。(2)破壞自己進程空間之外的內存。(3)未經授權讀寫文件。

6.體系結構中立

編譯器生成一個體系結構中立的目標文件格式,這是一種編譯過的代碼,只要有Java運行時系統,這些編譯後的代碼就可以在許多處理器上運行。Java編譯器通過生成與特定計算機體系結構無關的字節碼指令來實現這一特性。精心設計的字節碼不僅可以很容易的在任何機器上解釋執行,而且還可以動態地翻譯成本地機器代碼。

7.可移植性

 與C/C++不同,Java規範中沒有“依賴具體實現的地方”。基本數據類型的大小以及有關運算都做了明確的說明。例如,Java中的int永遠是32位的整數,二在C/C++中,int可能是16位整數,32位整數,也可能是編譯器提供商指定的其他大小。在Java中,數據類型具有固定的大小,這消除了代碼代碼移植時令人頭疼的主要問題。

8.解釋型

Java解釋器可以再任何移植了解解釋器的機器上執行Java字節碼。由於鏈接是一個增量式且輕量級的過程。所以開發過程也變得更加快捷,更加具有探索性。

9.高能性

儘管對解釋後的字節碼性能已經比較滿意,但是在某些場合下可能需要更加高效的性能。字節碼可以(在運行時刻)動態的翻譯成對應運行這個應用的特定CPU的機器碼。

10.多線程

 Java在當時很超前,他是第一個支持並發程序設計的主流語言,多線程可以帶來更好的交互影響和實時行為。並發程序設計絕非易事,但是Java在這方面表現出色,可以很好的管理這個工作。

11.動態性

Java與C/C++相比更具有動態性。它能夠適應不斷發展的環境。庫中可以自由的添加新方法和實例變量,而對客戶端沒有任何影響。在Java中找出運行時類型信息十分簡單。

北大青鳥java培訓:什麼是Java,你對Java有多少了解?

每個人對Java的理解是不同的,如何才能更好的理解Java呢?如果想要和沒有接觸過Java的人解釋Java是非常困難的。

Java是一門編程語言,在不斷的發展中,已經超出了簡單的編程語言,Java主要包括虛擬機環境,類和支持軟件等,並且能夠很好的使用在各個操作系統中。

廣東北大青鳥發現Java技術主要有JavaSE、JavaEE和JavaME等。

Java的應用領域是非常廣的,並且使用的方法也是不同,如果你是一名Java開發人員,那麼你需要更好的了解自己是在那個領域裡面,這樣才能在軟件開發的學習中得到更好的發展。

Java一直是使用廣泛的編程語言,並且在使用過程中比很多腳本語言相加的總數還多,Java的使用平台支持可以由不同的腳本語言進行的程序運行,這是數字還能進行重疊。

在很多情況下,能夠很好的運行這些應用程序,並且廣東電腦培訓發現還能將編寫的代碼進行重新優化。

Java是很多大型企業中首選的語言開發平台,並使用數量一直在持續增長,Java能夠為開發者提供免費的服務,在很多大學裡面,首選的學習語言也是Java,雖然Java的使用範圍非常廣闊,但是在使用過程中也是會存在一些問題,我們應該正確的審視的,這樣對未來的發展有很大的幫助。

額外支持的語言:Java平台支持使用不同語言編寫的應用程序。

廣東java培訓發現現在將添加更多語言支持,包括對動態語言的支持。

這被稱為DaVinci或多語言虛擬機。

特別是,JVM增加了對動態語言的支持,因此需要花費很多精力來添加對更多語言的支持。

在此之前,Java編譯器需要額外的編碼才能對Java語言的靜態需求產生正確的影響。

動態語言支持,導致JIT編譯時間增加,並且比正常的內存消耗大得多,從而增加了垃圾收集的數量。

在JavaSE中已經開始有了增強,可以在運行的過程中修改已經存在的類字節碼,所以在使用過程中,需要消耗的持久化空間就會更少一些,並且垃圾回收的次數也會得到減少。

在使用JIT的過程中,廣東電腦培訓建議可以優化更多編譯後的代碼。

原創文章,作者:INT1X,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/128388.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
INT1X的頭像INT1X
上一篇 2024-10-03 23:25
下一篇 2024-10-03 23:25

相關推薦

  • int類型變量的細節與注意事項

    本文將從 int 類型變量的定義、聲明、初始化、範圍、運算和類型轉換等方面,對 int 類型變量進行詳細闡述和講解,幫助讀者更好地掌握和應用 int 變量。 一、定義與聲明 int…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python計算機語言的特性與應用

    Python,是一種高層次、解釋型的、面向對象的計算機編程語言。 一、簡介 Python編程語言的初衷是:代碼簡潔易讀、可拓展性強、適用範圍廣。其應用領域包括Web開發、數據科學、…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Python基本數字類型

    本文將介紹Python中基本數字類型,包括整型、布爾型、浮點型、複數型,並提供相應的代碼示例以便讀者更好的理解。 一、整型 整型即整數類型,Python中的整型沒有大小限制,所以可…

    編程 2025-04-29
  • Python中的Bool類型判斷

    本篇文章旨在講解Python中的Bool類型判斷。在Python中,Bool類型是經常使用的一種類型,因此掌握其用法非常重要。 一、True和False 在Python中,True…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29

發表回復

登錄後才能評論