JRuby和Java 7 我們可以期待什么
原創【51CTO外電頭條】Java 7已經粉墨登場了,這次帶來的新功能感覺有些普普通通,當然還是有幾個重要改進。那么對于在Java 7上運行的JRuby,我們能夠期待些什么呢?
Java 7改變了什么?
Java 7中***的改變和Java語言本身并沒有什么關系。當然,Java 7中的“project coin”提高了Java語言的異常處理能力,還有新的數字、數組、哈希常量、開發者們經常要求的“字符串開關(strings in switch)”支持,還有一些別的東西等等。但這些都是些綜合性的功能提高,真正的革新出現在JVM和JDK級別。
新的字節碼Invokedynamic
Java 7中最重要的變化是加入了一種新的字節碼——invokedynamic——還有一個API,用來建立“方法句柄(method handle)”序列來支持這個字節碼。
你可以把invokedynamic看做JVM用戶與后臺的JVM進行直接溝通的途徑。方法句柄可以同時作為函數的pointer和combinator,允許用內置的方式建立一個從調用器到被調用者的調用協議。通過invokedynamic,你可以移除參數、插入新的參數、處理現有參數以及返回值,還可以用來捕獲異常。Invokedynamic字節碼本身提供了一個字節碼級別的鉤子,你可以把方法句柄序列附加在上面,這樣在道理上JVM就可以直接進入invokedynamic的調用器對序列進行優化。
通過invokedynamic,讓JVM能夠直接穿透復雜的方法調用邏輯的原因是tl;dr,其他動態語言也經常這樣做,還可以把邏輯優化為就像通常的靜態調用。
JRuby的master branch已經大量利用到invokedynamic的好處了,通過invokedynamic操作引導大多數的Ruby函數調用。對于簡單路徑和那些通過Hotspot(OpenJDK的核心VM)優化的函數,invokedynamic通常能夠提供150%到200%的性能提升,編寫函數的工作也變得更快更方便。對于其他一些沒有經過OpenJDK 7 “dot zero”版本優化的路徑,invokedynamic的表現沒有那么好,因此在這里還有提升的空間。
因為JRuby早已開始使用invokedynamic,所以你現在就可以試試它了:
1. 從master開始建立自己的JRuby。
2. 從Oracle下載OpenJDK 7。
3. 在新的JDK中指向JAVA_HOME,開始試用JRuby。
NIO.2
NIO指的是Java的“New IO”API,這里包裹著一套低級別的文件說明符邏輯和內存緩沖。NIO在Java 1.4中就出現了,但最近升級為NIO.2,帶來了一些迫切需要的功能:
文件系統操作(比如symlink和permission等等)現在幾乎都可以通過NIO.2的文件系統API來完成。同時還包含了對文件系統事件的標準的跨平臺支持,比如觀察目錄變化(有效使用OS級別操作而非輪詢)等等事件操作。
文件和目錄的walk操作占用的系統開銷得到了大量降低,用于過濾目錄時也有了更多的選項。
大多數的IO通道類型現在都擁有了異步版本。在這里,異步的意義在于“把IO操作放到內置的線程池”,通過代碼檢查操作狀態,獲得“未來”句柄結果。
對于JRuby來說,新的IO API意味著我們可以支持更多的跨平臺文件系統操作,而不用生成原始碼。同時它還能夠提供給JRuby用戶處理文件系統事件和異步IO操作功能,而不需要使用專用的平臺庫。JRuby的核心類目前還沒有開始添加NIO.2支持,但很快就會開始。
綜合改進
在OpenJDK中還有很多小改進,它們不那么顯眼,但對JRuby也很有幫助。
即使沒有invokedynamic,***的OpenJDK 7也比OpenJDK 6要強上不少。一些評測已經證實大概速度能夠快上兩倍,我們只需要升級JVM即可。OpenJDK 7的綜合改進看上去普普通通,但幾乎在我們測試到的每一個方面,結果都很令人滿意。
OpenJDK 7的發布也帶來了“階梯式(tiered)”編譯模式的進步。階梯式編譯模式的目標是把“client”模式(帶來最快的初始化速度)和“server”模式(帶來***的峰值性能)加以合并,你可以使用-XX:+TieredCompilation來開啟階梯編譯。
這些綜合改進意味著即使是JRuby 1.6.x這些版本的用戶都能夠開始使用OpenJDK 7***帶來的種種好處了,在JRuby 1.7中,這些改進的效果顯然會更加明顯。
兼容性
和從前其他版本的Java發行時一樣,人們都會做出大量的小心翼翼的工作來確保現有的應用能夠正常運行。Java 7也沒什么不同。我們已經一遍遍的測試Java 7一年多了,在兼容性方面一直表現穩定,即使是最近大量使用invokedynamic的情況下。
在JRuby中,我們沒有針對Java 7做出什么主要的改動,目前看來不會出現什么兼容性問題。
原文標題:JRuby and Java 7: What to Expect
【編輯推薦】