標籤:
預計發布的Java 9中,最令人興奮的特性是什嗎?
有關Java9的訊息最近顯得有些沉寂,不要被它迷惑了。JDK開發人員正在努力朝著下一個版本邁進,計劃2015年12月前完成所有功能開發。之後,它會經曆嚴格測試和bug修複以準備它的全面上市,按計劃會在2016年9月發布。
今天我們已經對Java 9中所期待的特性有了一個很清晰的圖景。如果Java 8可以被描述為主要是lambdas運算式、streams和API變化的話,那麼Java 9就是關於Jigsaw、額外的工具 + 生產力和內部的變化。在這篇文章中,收集了一些我們認為是Java 9中最期待的特性——除了通常的猜測之外,Jigsaw項目,承擔了打破JRE並對Java核心組件模組化的使命。
這裡有一些特性是Java 9中絕對必要瞭解的,其中的一些已經在早期的發布版本中為你搗鼓做好了準備。
1.Java + REPL = jshell
是的。之前我們懷疑Kulla項目是否會在Java 9中準時發布,但現在已得到了官方確認。下一版發布的Java將會有稱為jshell的新命令列工具,它會添加本地支援和以Java方式對REPL(互動式解譯器)進行推廣。意思是說,如果你想只運行幾行Java代碼,你不必把它封裝進一個單獨的工程或者方法。
噢,你可以忘掉那些分號了:
| 123 |
-> 2 + 2| 運算式的值是4| 將臨時變數$1的類型設為int |
還有一些像REPL附加元件一樣的替代品會增加到流行的IDE和解決方案中,就像Java REPL網頁控制台。但目前為止,還沒有官方的或者合適的方式來這麼做。jshell在早期的版本中已經可以用了,等著你給它來個測試回合。
2、微基準測試要來了
由Alexey Shipilev開發的Java微基準測試套件(Java Microbenchmarking Harness)正在其進化的下一階段,並加入Java作為官方基準解決方案。我們真的很喜歡在Takipi做基準,所以一套標準化的執行方式是我們期待的。
JHM是一組用來編譯、運行和分析nano/micro/milli/macro基準的套件。當涉及到精確基準評估,對結果產生很大影響的能力將備受關注,比如預熱時間和最佳化。當你以微秒或納秒計時的情況下尤其如此。所以,如果你想要更加精確的結果來協助跟蹤基準以做出正確的決定,JMH是你的最佳選擇——並且現在它已經成為Java 9的同義字了。
3、G1會成為新的預設垃圾收集器嗎?
我們經常聽說的一個誤解是:Java只有一個垃圾收集器,而事實上它有4個。Java 9中,仍有一個運行提議,關於替換由Java 7引入的G1預設垃圾收集器(並行/輸送量收集)的討論。不同收集器之間差別精簡概述,可以查看這篇裡的文章。
通常來說,G1被設計來更好地支援大於4GB的堆,並且不會造成頻繁的GC暫停,但當暫停發生時,往往會處理更長時間。最近我們和Outbrain的效能專家Haim Yadid討論了關於GC的方方面面,來協助你瞭解更多各收集器之間不同的權衡。同樣,如果你想要深入瞭解相關討論,那麼hotspot-dev和jdk9-dev的郵件組是個開始學習不錯的地方。
4、未來是HTTP 2.0
官方的HTTP 2.0標準是幾個月之前被獲批准的,基於Google的SPDY演算法構建。SPDY已經展示了相對HTTP 1.1巨大的速度提升,範圍在11.81%到47.7%之間,並且它已經存在於大多數現代的瀏覽器中了。Java 9將全面支援HTTP 2.0,並且為Java配備一個全新的HTTP用戶端來替代HttpURLConnection,並且同時還實現HTTP 2.0和websockets。
5、進程API得到了巨大的推動
到目前為止,通過Java來控制和管理作業系統進程能力有限。例如在早期版本的Java中,為了做一些簡單的事情,像得到進程PID,要麼訪問機器碼,要麼用某種神奇的臨時解決方案。此外,還可能需要一個對於每個平台提供不同實現來保證你得到正確的結果。
在Java 9中,除了擷取Linux PID的代碼,現在都像這樣來擷取:
| 1234567891011 |
public static void main(String[] args) throws Exception { Process proc = Runtime.getRuntime().exec(new String[]{ "/bin/sh", "-c", "echo $PPID" }); if (proc.waitFor() == 0) { InputStream in = proc.getInputStream(); int available = in.available(); byte[] outputBytes = new byte[available]; in.read(outputBytes); String pid = new String(outputBytes); System.out.println("Your pid is " + pid); }} |
轉向像這樣的代碼(同樣也支援所有的作業系統):
| 1 |
System.out.println("Your pid is" + Process.getCurrentPid()); |
這一更新將擴充Java與作業系統互動的能力:全新的直接操作PID、進程名和狀態的方法,操作JVM線程和進程等等能力。
你不會在Java 9中見到什嗎?
我們以為兩個有趣的特性會作為即將到來的Java發布版本中的一部分——但現在我們知道它們將不會出現在這次發布的版本。
1、一個標準的輕量級JSON API
在我們進行的一項對350名開發人員的調查中,JSON API就像Jigsaw一樣被大肆宣傳,但看起來它好像沒在發布版本中,原因可能是資金問題。Mark Reinhold,Java平台的首席架構師,在JDK 9的郵件清單中寫到:
“這個JEP對於平台來說是個有益的補充,但長遠來看,考慮到資金的因素以及Oracle資助的其它特性,它並不如其它特性一樣重要。我們考慮可能在JDK 10或者之後的版本再發布這個JEP。”
2、金錢和貨幣API
有一條新聞,似乎看起來金錢和貨幣API也缺少Oracle的支援。這是我們從Anatole Tresch那裡得到的答案,這個API的產品推廣師:
@tkfxin 目前不會。從Oracle那裡沒得到支援。取而代之的,我們將提高Java EE支援並且spring也將支援它 :)
– Anatole Tresch (@atsticks) 2015年6月16日
我們遺漏了什麼嗎?請在下面的評論區告訴我們吧。沒有空閑時間?來看看何時以及為何在產品中代碼會出現失敗中斷。
即將改變軟體開發的5個Java9新特性