JVM

JVM

JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。

引入Java語言虛擬機後,Java語言在不同平台上運行時不需要重新編譯。Java語言使用Java虛擬機禁止了與具體平台相關的信息,使得Java語言編譯程式只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平台上不加修改地運行。

基本介紹

  • 中文名:Java虛擬機
  • 外文名:Java Virtual Machine
  • 簡稱:JVM
  • 套用學科:計算機軟體
  • 軟體語言:Java
概述,體系結構,必要性,記憶體管理,特性,碎片回收,

概述

Java虛擬機有自己完善的硬體架構,如處理器、堆疊、暫存器等,還具有相應的指令系統。
Java虛擬機本質是就是一個程式,當它在命令行上啟動的時候,就開始執行保存在某位元組碼檔案中的指令。Java語言的可移植性正是建立在Java虛擬機的基礎上。任何平台只要裝有針對於該平台的Java虛擬機,位元組碼檔案(.class)就可以在該平台上運行。這就是“一次編譯,多次運行”。
Java虛擬機不僅是一種跨平台的語言,而且是一種新的網路計算平台。該平台包括許多相關的技術,如符合開放接口標準的各種API、最佳化技術等。Java技術使同一種套用可以運行在不同的平台上。Java平台可分為兩部分,即Java虛擬機(Java virtual machine,JVM)和Java API類庫。

體系結構

每個Java程式都離不開Java虛擬機,Java程式的運行依靠具體的Java虛擬機實例。在Java虛擬機規範中,分別用子系統、記憶體區、數據類型以及指令這幾個術語來描述的。這些組成部分一起展示出一個抽象化的虛擬機內部的抽象體系結構。
JVMJVM
Java虛擬機主要分為五大模組:類裝載器子系統、運行時數據區、執行引擎、本地方法接口和垃圾收集模組。其中垃圾收集模組在Java虛擬機規範中並沒有要求Java虛擬機垃圾收集,但是在沒有發明無限的記憶體之前,大多數JVM實現都是有垃圾收集的。而運行時數據區都會以某種形式存在於每一個JAVA虛擬機實例中,但是Java虛擬機規範對它的描述卻是相當抽象。這些運行時數據結構上的細節,大多數都由具體實現的設計者決定。
Java虛擬機不是真實的物理機,它沒有暫存器,所以指令集是使用Java棧來存儲中間數據,這樣做的目的就是為了保持Java虛擬機的指令集儘量的緊湊,同時也便於JAVA虛擬機在那些只有很少通用暫存器的平台上實現。另外,JAVA虛擬機的這種基於棧的體系結構,有助於運行時某些虛擬機實現的動態編譯器和即時編譯器的代碼最佳化。

必要性

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

記憶體管理

(1)對於Java運行時涉及到的存儲區域主要包括程式計數器、Java虛擬機棧、本地方法棧、java堆、方法區以及直接記憶體等等。對於每個部分,都有其使用的條件。程式計數器主要是取下一條指令,在Java裡面主要是取下一條指令的位元組碼檔案;Java虛擬機棧主要是利用棧先進後出的特性存儲局部變數表,動態連結等,主要包括堆記憶體和棧記憶體,對於程式設計師記憶體分析而言是特別重要的。本地方法棧與上邊的棧基本作用差不多,只不過這裡是為Java方法而服務。Java堆是記憶體管理中最大的一塊,所有的執行緒共享這一塊內容,同時該部分也是垃圾收集器的主要區域。
(2)虛擬機的垃圾回收機制是完善的,動態記憶體分配和回收是比較成熟的,在記憶體管理機制中,大部分都不需要我們考慮記憶體回收,只有Java堆和方法區需要我們考慮處理記憶體問題。一般的對於記憶體回收首先就是判斷某一個部分是生存還是死亡,主要是通過下面二種算法:
其一是引用計數算法,本算法實現簡單,判定的效率也是比較高的,很多的軟體都使用了該算法,但是主流的Java並沒有選擇該算法,核心的問題是該算法難以處理對象之間相互調用的問題。
其二是稱可達性分析算法,該算法核心思想是依靠判斷對象是否存活來實現的,本算法是通過一系列的GC ROOTS的對象作為起始點,採用搜尋的算法遍歷引用鏈,如果搜尋過程中沒有發現該節點,則認為該節點是不可達的,即可回收的,在現在的主流Java裡面,一般可以使用該算法處理問題。

特性

1、移植性
無論是GC還是Hotspot都可以用在任何Java可用的地方。比方說,JRuby可以運行在其他平台上,Rails套用就可以運行在IBM主機上的JRuby上,而且這台IBM主機運行的是CP/CMS.實際上,由於Java和OpenJDK項目的開源,我們正在看到越來越多的平台的衍生,因此JVM的移植性也將越來越棒。
2、成熟
JVM已有多年的歷史,在過去的這些年裡,許多開發者為它做出了許多貢獻,使得它的性能一次又一次地提升,讓JVM變得更加穩定、快速和廣泛。
3、覆蓋面
JRuby和JVM上的其他語言項目已經被承認,一個例子是invokedynamic specification(akaJSR292)。JSR越來越配合新的語言,JVM已不再是Java一個人定製規則。JVM正在構建成為類如JRuby等項目的優良平台。還有一個MLVM(multiple languageVM)項目,好比是新特性的清算機構,是一個許多企業套用的開發者試圖添加套用的地方,而這些套用正是他們想在JVM中看到的。而且JVM開發者互相協作、彼此影響,無疑這有利於JVM新特性的誕生。這些細節都可以看到JVM正在關注開發者的需求,擴大他的覆蓋面。

碎片回收

Java類的實例所需的存儲空間是在堆上分配的。解釋器具體承擔為類實例分配空間的工作。解釋器在為一個實例分配完存儲空間後,便開始記錄對該實例所占用的記憶體區域的使用。一旦對象使用完畢,便將其回收到堆中。在Java語言中,除了new語句外沒有其他方法為一對象申請和釋放記憶體。對記憶體進行釋放和回收的工作是由Java運行系統承擔的。這允許Java運行系統的設計者自己決定碎片回收的方法。在SUN公司開發的Java解釋器和Hot Java環境中,碎片回收用後台執行緒的方式來執行。這不但為運行系統提供了良好的性能,而且使程式設計人員擺脫了自己控制記憶體使用的風險。

相關詞條

熱門詞條

聯絡我們