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