JVM
JVM
JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。
引入Java語言虛擬機后,Java語言在不同平台上運行時不需要重新編譯。
Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。
Java虛擬機本質是就是一個程序,當它在命令行上啟動的時候,就開始執行保存在某位元組碼文件中的指令。Java語言的可移植性正是建立在Java虛擬機的基礎上。任何平台只要裝有針對於該平台的Java虛擬機,位元組碼文件(.class)就可以在該平台上運行。這就是“一次編譯,多次運行”。
Java虛擬機不僅是一種跨平台的語言,而且是一種新的網路計算平台。該平台包括許多相關的技術,如符合開放介面標準的各種API、優化技術等。Java技術使同一種應用可以運行在不同的平台上。Java平台可分為兩部分,即Java虛擬機(Java virtual machine,JVM)和Java API類庫。
每個Java程序都離不開Java虛擬機,Java程序的運行依靠具體的Java虛擬機實例。在Java虛擬機規範中,分別用子系統、內存區、數據類型以及指令這幾個術語來描述的。這些組成部分一起展示出一個抽象化的虛擬機內部的抽象體系結構。
JVM
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環境中,碎片回收用後台線程的方式來執行。這不但為運行系統提供了良好的性能,而且使程序設計人員擺脫了自己控制內存使用的風險。