Hotspot 性能架構 -轉

第一章:介紹和概述

Java HotSpot虛擬機是Sun公司的Java平臺一個高效的虛擬機實現。Java HotSpot技術提供Java標準平臺的基礎設施,提供對快速開發、部署關鍵業務的桌面和企業應用程序的解決方案。Java SE可應用在Solaris操做環境、Linux和Windows下,也能夠應用在其它經過Java技術認證的平臺下。




Java平臺已經成爲軟件開發和部署的主流工具。擁有成千上萬的開發者和用戶,java平臺在以下許多方面增加迅速:從信用卡到無線設備,從桌面機到大型機。Java平臺是部署網頁Applet、Web服務、大型商業程序等應用的基礎設施。

Java HotSpot構建在Java技術跨平臺和健壯的安全模型之上,並具有可擴展性、質量和性能方面的新特性。除了這些新特性以外,該版本的HotSpot是向上兼容的。

Java HotSpot幾乎全面支持企業應用的開發、部署和管理,它被用在:
  • 集成開發環境(IDE),如Sun Java Studio工具、NetBeans開源項目、IBM的Eclipse,Oracle JDeveloper等等。
  • 應用服務提供者,如Sun Java系統應用服務器、BEA系統WebLogic軟件、IBM WebSphere軟件,Apple電腦的WebObjects軟件等等。

Sun Microsystems, Inc.下致力於經過使用各類各樣的工具標準和內部開發的標準來改善性能。客戶和服務端Java虛擬機環境都能從這些性能的改善中獲益。

Java標準平臺包括Java虛擬機的兩個實現:
html

  • Java HotSpot客戶端虛擬機,當在客戶環境中經過減小應用啓動時間和內存佔用它被調優至最佳性能。
  • Java HotSpot服務端虛擬機,當運行在服務器環境中時,它被設計爲以最快的速度運行。

 

Java HotSpot虛擬機 -- 構建在堅實的基礎之上 前端


Java HotSpot虛擬機構建在擁有許多特性和能力的堅實基礎之上。支持動態、面向對象優化的架構使其具備世界級的性能。經過虛擬機支持的多線程使得即便在當今最大的計算機系統中也能得到很高的可擴展性。高度的可靠性(Reliability)、可用性(Availability)和可服務性(Serviceability)提供了企業級的可可靠性,也使其具有 快速開發、自省和可管理的能力


第二章:Java HotSpot虛擬機架構概述

Java HotSpot虛擬機是Sun的Java平臺虛擬機。經過聯合使用最新的內存模型,垃圾收集,和自適應優化多種先進的技術,它爲Java應用程序提供了最佳性能。如下用高屋建瓴(high-level)和麪向對象的風格對Java HotSpot的特色進行描述:
java

  • 統一的對象模型
  • 解釋、彙編、和本地的楨使用相同的堆棧
  • 基於本地線程的搶佔式多線程技術
  • 精確的代壓縮垃圾收集
  • 超級快速( Ultra-fast )的線程同步
  • 動態解優化(deoptimization)和積極( aggressive) 編譯優化
  • 虛擬機啓動時根據不一樣的系統產生相應的運行程序
  • 支持並行編譯的編譯器接口
  • 運行時性能檢測僅集中於對「熱」方法的編譯

JDK包括兩種不一樣形式的虛擬機,一個是用在客戶端,一個是爲服務器應用程序。 這兩種虛擬機共享Java HotSpot運行環境的代碼基,但因爲客戶端和服務器端各自不一樣的性能特色, Java HotSpot 爲其提供了不一樣編譯器。這些差別包括編譯內聯規則和堆默認值。

JDK的發佈版本中包含兩種形式的虛擬機,開發人員能夠經過-client或-server選項來選擇客戶端虛擬機或服務器
虛擬機。

服務器端和客戶端虛擬機很類似,爲儘量的提供高峯運行速度,服務器端虛擬機已做了專門優化。它是專爲執行長時間運行的服務器應用程序的,這種程序須要儘量快的運行,而不是須要啓動快或小的內存佔用。

客戶端虛擬機的編譯器是之前版本JDK所使用的經典(classic)虛擬機和即時(JIT)編譯器的升級。客戶端虛擬機提升了應用程序和Applets的運行性能。Java HotSpot客戶端虛擬機爲減小應用程序的啓動時間和內存佔用做了優化,這使得它特別適合於客戶端環境。通常來講,GUI特別適合使用客戶端虛擬機。

服務器端虛擬機編譯器執行的許多複雜優化,客戶端虛擬機的編譯器並不會執行,但與此同時,分析和編譯代碼塊的時間便會減小。這意味着客戶端虛擬機能夠啓動得更快和佔用更少的內存。

服務器端虛擬機包含了一種先進的自適應編譯器,它支持許多和C++編譯器支持的相同類型的優化,以及一些傳統編譯器所不能作的優化,如虛擬方法調用間的積極內聯(aggressive inlining)。與於靜態編譯器相比,自適應編譯器在這方面有着無可比擬的競爭優點。自適應優化技術在作法上是很是靈活的,典型狀況下甚至優於先進的靜態分析和編譯技術。

這兩種形式的虛擬機提供了很是可靠、安全、和可維護的環境,以知足當今企業客戶的須要。

圖左邊的是Java HotSpot客戶端虛擬機,右邊的是Java HotSpot服務器端虛擬機,它們使用不一樣的編譯器,可是使用相同的虛擬機接口,使用相同的垃圾回收程序、解釋器、線程和鎖子系統等等。


內存模型:沒有句柄對象 (Memory Mode Handless Objects)

在之前版本的Java虛擬機上,如經典虛擬機,使用間接句柄表明對象引用。這使得在垃圾回收過程當中的從新定位對象更容易(注:在垃圾回收過程當中對象的地址會改變),但存在明顯的性能瓶頸,由於對Java編程語言的對象訪問須要兩次間接訪問(注:首先訪問間接句柄,而後訪問實際的對象)。

Java HotSpot虛擬機中沒有使用間接句柄。對象引用就是直接指針。這使得訪問實例變量像在C語言中同樣快。當在內存回收過程當中對象被從新分配時,垃圾回收器是負責尋找和在適當位置更新全部對象引用。


兩個字(Word)的對象頭

Java HotSpot虛擬機採用了兩個字的對象頭,而不是像經典虛擬機中那樣使用三個字。因爲Java對象平均大小很小,這對空間消耗有重大影響,在典型的應用程序中,它能節省8%大小的堆空間。第一個字包含標識對象身份的哈希代碼和GC狀態等信息。第二個字是對對象所在類的引用。只有數組有第三個字,它是數組的大小。

反射數據也是對象

類、方法及其餘內部反射數據直接表現爲堆上的對象(雖然這些對象可能沒法在基於Java的程序中直接得到)。這不只簡化了虛擬機的內部對象模型,也使得類也能夠被垃圾回收器回收。

本地線程支持,包括對搶佔線程和多處理器的支持 程序員


Per-thread method activation stacks are represented using the host operating system's stack and thread model.每線程方法的激活棧使用主機操做系統的堆棧和線程模型。Java語言的方法和本地(native)方法共享相同的堆棧,這使得C和Java之間的方法調用很是快速。Java使用主機做業系統的線程調度機制提供對搶佔線程的支持。

使用本地操做系統線程和調度一個主要的優點是有可以充分利用本地操做系統對多處理器的支持。由於在執行Java程序時,Java HotSpot虛擬機並不知道因爲線程搶佔和多處理器所形成的競爭條件,Java線程會自動利用本地操做系統提供的任何線程調度和處理器分配規則。

垃圾回收

Java HotSpot內存系統本質上是着基於代的,這爲使用特定垃圾回收算法提供了靈活性,用來知足不一樣應用的要求。Java HotSpot虛擬機支持幾種不一樣的垃圾收集算法,用於知足不一樣的暫停時間和吞吐量的要求。

背景

Java對程序員的一個主要的吸引力是由於它是第一個提供內置自動內存管理,或垃圾收集(GC)的主流編程語言。傳統語言使用明確分配/釋放模型來動態內存分配。在實踐中,這不只是內存泄漏,程序錯誤及程序崩潰的重大來源,也是一個性能瓶頸和一個代碼模塊化和重用的主要障礙 (沒有模塊間明確的和難以理解的協做,決定跨模塊的內存釋放點幾乎是不可能的) 。在Java中,垃圾收集也是「安全」執行語義中一個重要部分。 算法


垃圾回收器在幕後自動釋放未使用對象所佔用的內存。這徹底消除了因爲釋放太少所形成的內存泄漏,以及釋放太多所形成的程序崩潰和難以發現的引用錯誤。

傳統的收集垃圾一直被視爲低效的過程,相對於明確釋放模型,它阻礙了性能。事實上,現代垃圾回收技術性能已經有很大的提升,以至於垃圾回收的總體性能已經大大優於明確釋放模型的性能。


Java HotSpot的垃圾 收集

除包括下述優秀的特性,內存系統被設計成一個乾淨的,面向對象的框架,它能夠很容易被度量(instrumented),實驗,或擴展使用新的垃圾收集算法。

Java HotSpot垃圾收集的主要特色介紹以下。總的來講,這些特色對如下兩類程序都是很是適合的:一類是須要儘量高的性能的應用程序,另外一類是須要長時間運行的應用程序,而且它不能容忍內存泄露和因爲內存碎片形成的內存不足。
數據庫

 

精確性 編程

 

Java HotSpot的垃圾 收集 器是一個徹底精確的 收集 器。相比之下,其餘許多垃圾收集是至關保守或部分準確。保守的垃圾收集能夠頗有吸引力,由於它是很容易添加到沒有垃圾收集的系統,它也有某些弊端。一般,保守的垃圾收集容易形成內存泄漏,不容許對象遷移並可能致使堆碎片。

保守收集器不肯定全部對象引用的位置。所以,保守收集器必須假設看起來是對象引用的內存字(word)就是一個對象引用。這意味着它會犯錯誤,如可能將一個整數誤認爲爲對象引用。看起來像指針的內存單元被認爲就是對象引用,這致使GC變得不精確。這有幾個負面影響。第一,當這些錯誤發生時(在實踐中不是很常常) ,內存泄漏以難以預料的方式發生,並且幾乎不可能被程序員重現或調試。第二,由於它有可能犯了一個錯誤,保守收集器必須使用間接指向對象的句柄,這下降了性能,或者避免從新分配對象,由於從新分配對象須要更新全部對象引用。若是收集器不肯定一個可能的引用是否爲一個真正的引用,這是不可能作到的。沒法從新分配對象會致使內存碎片,更重要的是,它不能使用先進的代拷貝收集算法。


由於Java HotSpot收集器是徹底精確的,它能夠做出保守收集器不能做出的強大設計保證:
後端

  • 全部沒法訪問的對象可以被可靠的回收。
  • 全部的對象可以被從新分配,這容許對象內存壓縮,於是消除內存碎片而且增長內存可定位性。

精確的垃圾收集機制避免了意外的內存泄漏,可以使對象從新分配,並提供充分的堆壓縮。Java HotSpot虛擬機的GC機制即便對於大型堆(heap)也表現很好。 數組

 


代拷貝收集(Genrational Copying Collection) 緩存


Java HotSpot虛擬機採用先進的代拷貝收集器,它提供以下兩點好處:

  • 相比較非代(nongenerational)收集器,對大多數程序它提升分配速度和整體垃圾收集效率。
  • 相應地也減小因爲垃圾回收形成用戶可覺察的暫停的次數和時間。

代收集器利用了這樣一個事實,即在大多數的程式,大多數對象(一般大於95%)很短命(例如,它們被用做臨時數據結構)。經過分配建立的物體分配到一個單獨的對象區,代收集器能夠完成幾件事。第一,由於新對象像棧同樣被連續分配在對象區,分配變得很是快,由於它只是涉及更新單個指針和執行一個對象區溢出檢查。其次,當對象區溢出時,大部分在對象區的對象已經死亡,垃圾 收集 器只是簡單地移動幾個倖存對象到其它地方,並不須要對象區已經死亡的對象作任何收集工做。

 


並行年輕代收集器(Parallel Young Generation Collector)


上述的單線程拷貝收集適合許多部署,但當擴展應用程序以利用多處理器時,這可能會成爲一個瓶頸。爲了充分利用多處理器機器全部可用CPU,Java HotSpot虛擬機提供一個可選的對年輕代的多線程收集器,跟蹤和拷貝倖存的對象是由並行的多線程同步完成。實現被仔細調整,它可以均衡可用處理器的收集工做,讓收集器可擴充到大量處理器。這下降了收集年輕代空間的暫停時間,而且最大化垃圾 收集 的吞吐量。並行收集器已經在超過100個CPU和0.5TB堆空間的系統上作過測試。服務器端虛擬機默認使用並行年輕代收集器算法。

當移動對象時,並行收集器儘可能使相關的對象在一塊兒,從而提升了內存可定位性和緩存利用率,並提升性能。這是經過以深度優先順序拷貝對象來完成的。

並行收集器也會優化內存的使用。它並不須要預留部分舊對象空間以保證拷貝全部倖存對象的所需的空間。相反,它使用一種新的預測技術來拷貝對象。若是舊對象空間很稀少,這一技術可讓收集器平滑地過分到壓縮堆,而不須要預留任何空間。這使得可以更好地利用可用堆空間。


最後,並行收集器是可以動態調整一些參數,這會改善許多應用和環境中的垃圾收集的性能。這意味須要較少的用戶手工調整。這種能力在並行收集器中被首次引入,如今也應用在許多其餘垃圾收集算法中。

要與默認的單線程收集器的性能至關,並行收集器須要2-4個CPU,這取決於平臺和應用。這種狀況預計在將來的版本中會有所改善。



標記緊湊舊對象收集器(Mark-Compact Old Object Collector)

儘管代拷貝收集器有效的收集大多數死亡對象,可是年長對象仍然在舊對象內存區中積累。 偶然地,由於低內存或程序請求,必須執行對舊對象的垃圾收集。Java HotSpot虛擬機默認使用標準標記緊湊收集算法,該算法從根開始遍歷整個存活對象圖,而後壓縮死亡對象留下的的空間。經過壓縮堆中空白,而不是將收集成一個鏈表,這減小了內存碎片同時使對象分配更有效率,由於這不須要對鏈表進行掃描。

 


多數標記緊湊對象收集器(Mostly Concurrent Mark-Sweep Collector)


若是應用須要很大的堆(heap),默認的舊代標記緊湊垃圾收集形成的暫停每每形成干擾,由於應用線程暫停的時間與堆的大小成正比。Java HotSpot虛擬機實現了一個可選的並行舊對象收集器,它利用了處理器的空閒週期來收集大堆 (heap) ,從而僅暫停線程很短的時間。這是經過在應用線程執行時作大量的跟蹤和清除工做來實現的。在某些狀況下,繁忙應用的吞吐量會有小幅降低,由於並行收集活動佔用了一些處理器週期;可是,平均和最壞狀況下的垃圾收集停頓時間,每每會減小了一到兩個數量級於是容許更平滑的應用響應,而不存在默認標記緊湊對象收集器運行在大型堆上時的忽然停頓。

 


並行舊代收集器(Parallel Old Generation Collector)


當前版本的Java HotSport虛擬機引入了一種並行標記舊代收集器,旨在提升須要大型堆
(heap) 的應用的可擴展性。而並行標記-清除收集器集中於減小暫停時間,並行舊代收集器集中於經過併發線程收集舊對象來增長吞吐量。並行舊代收集器使用許多新技術和內部數據結構,以實現高擴展性。

 


更多信息

瞭解更多關於Java HotSpot支持的垃圾收集算法,請參閱內存體管理白皮書

 


超級快速 的線程同步


Java語言容許程序並行執行--線程。Java提供語言級的線程同步,這使得書寫帶細粒度鎖的多線程程序變得很是容易。相比較於Java語言的其它微操做,之前版本的Java虛擬機如經典虛擬機的同步實現顯得很是低效,這使得細粒度同步成爲程序性能的一個主要瓶頸。

Java HotSpot虛擬機對非競爭性的和競爭性的同步採用了領先的技術,這使得同步操做的性能有了至關大的提高。非競爭性的同步操做,這佔同步操做的多數,被實現得很是快,僅僅是常量的時間。加上最新的優化,即便在多處理器計算機上這些同步操做在最好狀況下也幾乎是沒有代價的。競爭性的同步操做使用了先進的自適應旋轉(spinning)技術,這使得即便對存在至關多鎖競爭的應用程序也能提升程序的吞吐量。所以,同步操做已經變得如此之快以致於對現實世界中的大多數程序來講同步操做已經再也不是一個性能問題。



64位架構

早期的Java HotSpot虛擬機僅能尋址4G的內存空間,即便對於如Solairs OE這樣64位操做系統也是如此。儘管4G的內存對桌面系統是足夠的,可是如今的服務器一般會包含遠遠超過4G的內存。好比,Sun Fire E25K服務器支持超過1.15T的內存。隨着64位JVM的到來,基於Java的應用已經可以充分利用這些系統的所有內存。

有幾類應用使用64位尋址頗有用。好比那些在內存中存儲大量數據的應用。如今應用可以避免數據從磁盤中分頁或從關係數據庫中提取數據的開銷。這會大幅度提高這類應用程序的性能。

Java HotSpot虛擬機如今是64位安全的,服務器端虛擬機同時支持32位和64位的操做。用戶能夠經過命令行參數-d32和-d64來分別選擇32位或64位的操做。爲運行在64位虛擬機上,使用Java本地接口的用戶須要從新編譯他們的代碼。

 


對象打包

對象打包已經被添加進來,它的目的是爲了儘量的減小不一樣大小數據類型之間的空間浪費。這對64位環境很是有用,可是對32位虛擬機它也提供了必定的好處。

好比:

Java代碼 複製代碼  收藏代碼
  1. <SPAN style="FONT-SIZE: small">public class Button {   
  2.   char shape;   
  3.   String label;   
  4.   int xposition;   
  5.   int yposition;   
  6.   char color;   
  7.   int joe;   
  8.   object mike;   
  9.   char armed;   
  10. }</SPAN>  
public class Button { char shape; String label; int xposition; int yposition; char color; int joe; object mike; char armed; }


clolor和joe之間存在空間浪費(須要三個字節以對齊到int的邊界),joe和mike之間也存在空間浪費(對64位虛擬機須要四個字節對齊到指針邊界)。如今,對象字段將被從新排序成這樣:

Java代碼 複製代碼  收藏代碼
  1. <SPAN style="FONT-SIZE: small">...   
  2.   object mike;   
  3.   int joe;   
  4.   char color;   
  5.   char armed;   
  6. ...</SPAN>  
... object mike; int joe; char color; char armed; ...


這樣便不會有任何空間浪費了。

 

 


第三章:Java HotSpot編譯器

概述

爲提升Java程序性能,不少嘗試集中那些爲傳統語言開發的編譯技術。JIT編譯器就是一個快速的傳統編譯器,它在運行期間翻譯Java字節碼成本地機器碼。運行在終端用戶機器上的JIT實際執行字節碼並在每一個方法第一次執行時編譯。

可是JIT編譯器也存在某些問題。首先,由於編譯器運行佔用用戶時間,所以它嚴重受制於編譯速度:若是編譯速度不是很是快,那麼用戶將在啓動程序或程序的某部分察覺到重大延遲。它也使得很難執行高級優化技術,由於這一般會嚴重下降編譯性能。

其次,即便JIT有時間執行全面優化,對Java語言來講這種優化也不如像C、C++的傳統語言那麼有效。形成這種狀況有不少緣由:

  • Java語言是動態安全的,這意味着它確保程序不會違反語言語義或訪問非結構化內存。這意味必須頻繁動態測試(當向下轉型和對對象數組進行排序時)。
  • Java語言在堆中分配全部對象,不像C++,它在棧中分配許多對象。這意味着Java中的對象分配頻率要遠遠高於C++中的對象分配頻率。另外,由於Java語言帶垃圾回收,它同C++有着很是不一樣類型的內存分配開銷(包括潛在的搜尋可用空間和寫屏障(write-barrier)開銷)。
  • Java語言的大多數方法調用是虛擬的(潛在的多態),它們比在C++語言中被更頻繁的使用。這不只意味着方法調用性能佔據更支配的地位,同時也意味着靜態編譯優化器(尤爲是內聯那樣的全局優化)更難處理方法調用。許多傳統優化在方法調用之間最爲有效,這類優化在Java語言中變得不那麼有效。java語言的方法調用之間的距離一般很短,這與它們一般只與小部分的代碼工做有關。
  • 因爲動態類加載機制Java程序可以在運行時改變行爲。這使得更加難以作許多種類的全局優化。編譯器須要不只可以檢測因爲動態加載形成的優化失效,並且須要可以在運行是撤消或重作這些優化,即便它們涉及堆棧中活動方法。這必須在不違反或影響java程序執行語義的狀況下完成。


所以,要使Java語言性能獲得根本性的改善,必須提供對這些問題的非傳統的解決方法,而不是盲目的使用傳統的編譯技術。

Java HotSpot虛擬機架構經過下述的自適應優化技術解決了Java語言性能問題。

 


熱點檢測(HotSpot Detection)

自適應優化利用了一個很是有趣的程序屬性來解決JIT編譯問題。實際上全部的程序花費大量的時間執行很小一部分代碼。
Java HotSpot 虛擬機 沒有即時的一個方法一個方法的編譯,而解釋運行程序,而且分析代碼以檢測程序的關鍵熱點代碼。而後它集中對這些熱點代碼使用全局本地優化。經過避免編譯不多執行的代碼(大部分代碼都不多執行),Java HotSpot集中主意到程序的性能關鍵部分,又沒有增長整體的編譯時間。熱點監視在程序運行時動態進行,所以它會在運行時調整性能以知足用戶的要求。

這種方式的一個細微但很重要的好處是,經過延遲編譯直到代碼已經運行了一段時間,代碼被使用方式的信息可以被收集起來,而後用於執行一些更加智能的優化。內存佔用也會減小。除了收集程序的熱點以外,也會收集其它類型的信息,好比虛擬方法調用的調用者-被調用者的關係。



方法內聯

Java語言虛擬方法調用的頻率成爲一個很重要的優化瓶頸。一旦Java HotSpot自適應優化器收集到程序熱點,它不只編譯這些熱點代碼成本地代碼,並且執行大量的方法內聯。

內聯有很重要的好處。它急劇減小方法調用的頻率,它減小了執行方法調用的時間。更爲重要的是,內聯產生了更大的代碼塊能夠被優化器利用。這樣就大大增長傳統編譯器優化技術的有效性,同時克服了增長Java語言性能的一個主要障礙。

內聯與其它代碼優化一塊兒使用,由於這使得它們更加高效。隨着Java HotSpot編譯器的成熟,內聯代碼塊將向更多高級優化敞開大門。



動態解優化(Dynamic Deoptimization)


儘管上部分描述的內聯是一個很重要的優化技術,可是它傳統上一直難以使用在像Java這樣的動態面嚮對象語言上。儘管檢測熱點和調用的內聯方法已經足夠複雜,可是它並不能知足所有Java編程語言的語義。這是由於Java程序不只可以在運行期間改變方法調用的模式,並且也能在運行期間動態加載新的Java代碼。

內聯基於全局分析。動態加載顯著地更加了內聯的複雜度,由於它改變了程序的全局關係。一個新的類可能包含須要在某個地方被內聯的新方法。所以Java HotSpot必須可以動態解優化(而且從新優化,若是必需)先前優化的熱點代碼,即便在正在執行熱點代碼。沒有這種能力,通常的內聯不能安全的用在Java程序中。

Java HotSpot客戶端和服務器端編譯器都充分支持動態解優化。這使得積極樂觀優化(aggressive and optimistic optimization)和其它優化技術如全速調試(full-speed debugging)成爲可能。



Java HotSpot客戶端編譯器

Java HotSpot客戶端編譯器是一個簡單快速的三階段編譯器。在第一個階段,一個平臺獨立的前端構造字節碼的一個高級中間代碼(high-level intermediate representaion, HIR)。HIR使用靜態單分配(static single assignment, SSA)形式來表明代碼值,這是爲了使發生在IR構造期間和以後的一些優化更容易。在第二個階段,平臺特定後端從HIR產生低級中間代碼(low-level intermediate representation, LIR)。最後的階段使用自定義的線性掃描算法在LIR上分配寄存器,在LIR上作窺孔(peephole)優化,而後從HIR中產生機器代碼。

重點被放在從字節碼中提取和保存儘量多的信息。客戶端編譯器集中在局部代碼質量,它不多作全局優化,由於這會消耗不少編譯時間。



Java HotSpot服務器端編譯器

服務器端編譯器爲典型的服務器應用的性能配置作過調整。Java HotSpot服務器端編譯器是一個高級充分優化編譯器。它採用了一種先進的基於靜態單分配(SSA)的IR作優化。優化器執行全部的經典的優化,包括清除死代碼,提出循環不變式,消除共同子表達式,常量傳播,將全局值數字化,全局代碼移動。它還採用和Java技術更密切的優化技術,如空值檢查和範圍檢查,異常拋出路徑的消除和優化。寄存分配器是一個全局圖着色分配器,它充分利用廣泛使用在RISC徽處理器上的大寄存器集合。編譯器是高度可移植的,它依靠機器描述文件來目標硬件各方面的特徵。以JIT的標準來看,編譯器是緩慢的,但它的速度仍然遠遠超過傳統的優化編譯器,代碼質量的提升 減小了執行時間 ,從而抵消了額外的編譯時間


編譯優化


Java HotSpot支持一整套高級優化技術,它們即可以優化傳統的流線程序也可以優化面向對象的程序。其中的一些優化包括:

  • 深度內聯而且內聯可能的虛擬方法調用:正如前面描述的那樣,客戶端和服務端編譯器聯合使用方法內聯、全局分析和動態優化來進行深度內聯,這顯著減小了方法調用開銷。
  • 快速的instanceof/checkcast:Java HotSpot虛擬機和編譯器支持一種新型的技術,它加快了Java程序因類型安全而須要頻繁執行的類型測試的時間。這進一步減小了面向對象編程的時間消耗。
  • 取消範圍檢查:Java語言規範要求在每次對數組進行訪問時都進行數組邊界檢查。編譯器能夠取消邊界檢查,若是它能夠證實數組訪問老是在邊界之內。
  • 解循環(loop unrolling):服務器端虛擬機有解循環的功能,這是一個標準的編譯器優化,它可以使循環執行得更快。解循環增長循環體的大小同時也減小了迭代的次數。解循環也增長其它優化的有效性。
  • 反饋導向優化:服務器端虛擬機在編譯Java字節碼成優化的機器代碼以前會在解釋器中執行普遍的性能檢測。檢測到的數據提供給編譯器更多關於使用的數據類型和代碼間的熱點路徑等信息。利用這些信息,在某些條件下編譯器可以更加積極樂觀地去優化代碼。若是運行期間某個假設的屬性被違反了,代碼會被解優化,之後將會被從新編譯和從新優化。

 

第四章:Java HotSpot虛擬機的高級特性

Java HotSpot虛擬機支持許多高級特性,它們促使了高擴展性,高性能和企業級的可靠性,可用性和可服務性。


可擴展性

 

Java HotSpot虛擬機添加自動調整大小和自適應的技術,這被稱爲人機工程學。目前,人機工程學體如今兩個主要領域。首先,根據機器的物理配置(例如,考慮處處理器的數量和可用的物理內存),客戶端或服務器虛擬機將被自動被選中。特別是,帶有大量處理器和內存的機器將被自動使用服務器端虛擬機,垃圾回收堆的大小也會根據應用硬件的配置被自動設置爲合適的值。第二,Java HotSpot虛擬機的垃圾收集算法可以作自我調整,已經不須要明確指定年青和年老代的相對大小。垃圾收集器會自我調整以改善應用的吞吐量,並減小暫停。人體工學技術自動改善服務器端應用的可擴展性,未來的版本在這個領域已經計劃要作更多的工做。

 


性能


除了Java HotSpot虛擬機架構提供的核心的面向對象的優化,虛擬機和Java運行環境也支持一些其它的關鍵性能優化:

  • 快速反射:Java庫如今頻繁使用方法和構造器之類的反射對象來產生字節碼樁。這種技術將反射調用暴露給Java HotSpot編譯器,這得到了更高的性能,在某些狀況下服務器端的虛擬機可以徹底消除反射調用帶來的開銷。這顯著加快了大量使用反射代碼的執行速度,好比在序列化、RMI和CORBA的代碼環境中。
  • 新I/O優化:Java HotSpot編譯器特殊對待在新I/O緩存上的操做,這爲get和put方法調用產生高質量的機器代碼。得益於新的I/O API,網絡和文件I/O中性能和可擴展性已經獲得大幅度提高,這些使得Java應用如今已經可以達到能夠和C和C++應用相媲美的吞吐量。新的I/O緩存優化也可以應用在其它領域,好比3D圖像、在Java平臺和外部世界之間傳輸大量數據。


可靠性,可用性和可服務性

當前版本的Java HotSpot是目前爲止最可靠的虛擬機。最近版本的虛擬機創造了企業應用的可靠性和可用性的新紀錄。

Java HotSpot虛擬機包含Java虛擬機工做接口的參考實現(Java Virtual Machine Tools Interface, JVM TI)。這容許性能檢測、調試和監視器之類的工具去觀察和控制JVM。包含的特性有:

  • 全速調試:Java HotSpot虛擬機利用動態解優化技術來支持應用的全速調試。早期版本的Java虛擬機實現,當激活調試時,應用僅會被在解釋器中執行。在調試語義中激活Java HotSpot編譯器將得到巨大的性能提高,而且在不少情形下可能經過運行調試支持來得到更好的應用可服務性。另外,調試器可以在某種異常被拋出時激活。
  • 執交換(HotSwap)支持:Java HotSpot虛擬機的面向對象架構使得能支持一些高級特性,如運行期間類的重定義或者」熱交換「。這個特性使可以經過調試API替代正在運行程序爲更改後的代碼。熱交換爲Java平臺高度架構提供額外的功能,在調試器的控制下類可以在執行過程當中被更新。經過將原方法熱交換成性能檢測代碼被插入後的方法,它可以執行性能檢測操做。

Java HotSpot虛擬機中的幾個額外特性加快了Java應用程序開發和提升了可服務性。

  • JNI錯誤檢測:經過命令行選項-Xcheck:jni,可以執行JNI檢查。在開發過程當中打開此選項,使得可以檢測在程序部署以前就檢測出參數合法性。具體來講,Java HotSpot虛擬機會驗證傳給JNI函數的參數,也會驗證處理JNI請求時運行環境數據。任何遇到的無效數據被認爲是本地代碼的錯誤,這時虛擬機將會終止執行。
  • 錯誤報告。若是JVM檢測到本地代碼的崩潰,好比開發者寫的JNI代碼或者虛擬機自己,它將打印和記錄關於崩潰的調試信息。錯誤消息一般報信函數名、庫名、源文件名和錯誤發生的行數。這使得開發者可以容易和有效地高度應用程序。若是錯誤消息指示是JVM代碼的錯誤,它容許開發者提交一份更精確和有用的bug報告。
  • 信號鏈設施(Singal-chaining facility)。信號鏈使Java平臺可以更好地與安裝了信號處理器的本地代碼進行互操做。信號鏈設施可工做在Solaris和Linux平臺上。信號鏈設施的引入是爲了之前版本Java HotSpot虛擬機有關信號處理的一個問題。在1.4版本以前,Java HotSpot虛擬機不容許爲某些信號安裝應用信號處理器,這些信號包括SIGBUS、SIGSEGV或SIGILL,由於這些信號可能與Java HotSpot虛擬機內部使用的信號處理器衝突。


第五章:對軟件重用性的影響


概述

 

面向對象編程的一個主要好處是,經過爲軟件重用提供強大的語言機制,它可以增長開發生產力。在實踐中,不多達到這樣的軟件重用。大量使用這些機制將顯著下降程序性能,這致使程序員不多使用它們。Java HotSpot技術的一個使人驚奇的副效應就是它顯著下降了性能損失。Sun相信,經過第一次就充分利用面向對象的重用機制,而不向軟件性能做妥協,這將徹底影響面向對象軟件開發的方式。

很容易舉出這方面的例子。一份對Java程序員的調查顯示許多程序員避免充分地使用虛擬方法(一般也書寫很大的方法),由於他們認爲虛擬方法調用將致使嚴重的性能懲罰。使用處處存在的細粒度虛擬方法,好比Java語言中那些非靜態或非final的方法,對構造高度重用的類是極其重要的,由於這些方法充當了一個鉤子,容許被子類覆蓋父類的行爲。

由於Java HotSpot虛擬機內聯許多虛擬方法調用,這種性能懲罰已經戲劇性地減小了,在許多狀況下甚至是徹底抵消了。

對這個效應的重要性再怎麼估計也不算過份。它有可能從根本上改變面向對象代碼書寫的方式,由於它極大的改變使用重要重用機制的性能平衡。另外,面向對象技術已經成熟,這已經變得很清楚。如今已經變得愈來愈傾向使用細粒度的對象和方法。這個趨勢明確無誤地代表將來的代碼風格將使用更多的虛擬方法。隨着更高層的代碼風格變得流行,Java HotSpot技術的優勢將變得更加明顯。



第六章:總結

Java HotSpot虛擬機爲Java應用提供了最佳的性能,它提供了高級優化、垃圾回收和線程同步。另外,爲了提升Java程序的可靠性、可用性和可服務性,虛擬機也提供調試能力。Java HotSpot虛擬機爲客戶環境和服務器環境提供了單獨的編譯器,這使得應用可以根據目標部署環境獲得最優性能。經過64位的Java HotSpot的服務器端編譯器,可擴展性有了極大的提升。


使用Java HotSpot虛擬機,客戶應用程序可以啓動得更快、打敗更小內存,而服務器程序在長期運行中可以得到更好的性能。兩種解決方案都提供了極其可靠、安全和可維護的環境來知足當今企業用戶的需求。




第七章:可用性


Java HotSpot虛擬機被包含在Java標準平臺環境裏。能夠從http://java.sun.com/ 獲得下列環境的虛擬機:

  • 針對SPARC平臺的Solaris操做環境
  • 針對Intel平臺的Solaris操做環境
  • Linux操做系統:針對Intel平臺的Red Hat企業Linux的某些版本、SuSE Linux和Sun Java桌面系統。
  • 針對Intel平臺的微軟操做系統

 


第八章:資源

下面這些網頁提供了額外的信息:

相關文章
相關標籤/搜索