Java9的一些新特性介紹
被接受的特性
1. Jigsaw 項(xiàng)目;模塊化源碼
Jigsaw項(xiàng)目是為了模塊化Java代碼、將JRE分成可相互協(xié)作的組件,這也是Java 9 眾多特色種的一個(gè)。JEP是邁向Jigsaw四步中的第一步,它不會(huì)改變JRE和JDK的真實(shí)結(jié)構(gòu)。JEP是為了模塊化JDK源代碼,讓編譯系統(tǒng)能夠模塊編譯并在構(gòu)建時(shí)檢查模塊邊界。這個(gè)項(xiàng)目原本是隨Java 8發(fā)布的,但由于推遲,所以將把它加到Java 9.
一旦它完成,它可能允許根據(jù)一個(gè)項(xiàng)目需求自定義組件從而減少rt.jar的大小。在JDK 7 和JDK 8的rt.jar包中有大約20,000個(gè)類(lèi),但有很多類(lèi)在一些特定的環(huán)境里面并沒(méi)有被用到(即使在Java 8的緊湊分布特性中已經(jīng)包含了一部分解決方法也存在著類(lèi)冗余)。這么做是為了能讓Java能夠容易應(yīng)用到小型計(jì)算設(shè)備(比如網(wǎng)絡(luò)設(shè)備)中,提高它的安全和性能,同時(shí)也能讓開(kāi)發(fā)者更容易構(gòu)建和維護(hù)這些類(lèi)庫(kù)。
2. 簡(jiǎn)化進(jìn)程API
截止到目前,Java控制與管理系統(tǒng)進(jìn)程的能力是有限的。舉個(gè)例子,現(xiàn)在為了簡(jiǎn)便獲取你程序的進(jìn)程PID,你要么調(diào)用本地程序要么要自己使用一些變通方案。更多的是,每個(gè)(系統(tǒng))平臺(tái)需要有一個(gè)不同實(shí)現(xiàn)來(lái)確保你能獲得正確的結(jié)果。
期望代碼能獲取Linux PIDS,現(xiàn)在是如下方式:
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); } }
在Java 9中,可以變換成如下方式(支持所有的操作系統(tǒng)):
System.out.println("Your pid is " + Process.getCurrentPid());
這次更新將會(huì)擴(kuò)展Java與操作系統(tǒng)的交互能力:新增一些新的直接明了的方法去處理PIDs,進(jìn)程名字和狀態(tài)以及枚舉多個(gè)JVM和進(jìn)程以及更多事情。
3. 輕量級(jí) JSON API
目前有多種處理JSON的Java工具,但JSON API 獨(dú)到之處在于JSON API將作為Java語(yǔ)言的一部分,輕量并且運(yùn)用Java 8的新特性。它將放在java.util包里一起發(fā)布(但在JSR 353里面的JSON是用第三方包或者其他的方法處理的).
4. 錢(qián)和貨幣的API
在Java 8引進(jìn)了日期和時(shí)間的API之后, Java 9引入了新的貨幣API, 用以表示貨幣, 支持幣種之間的轉(zhuǎn)換和各種復(fù)雜運(yùn)算. 關(guān)于這個(gè)項(xiàng)目的具體情況, 請(qǐng)?jiān)L問(wèn)https://github.com/JavaMoney,里面已經(jīng)給出了使用說(shuō)明和示例, 以下是幾個(gè)重要的例子:
//新的類(lèi)型: Money & FastMoney Money amt1 = Money.of(10.1234556123456789, "USD"); // Money is a BigDecimal FastMoney amt2 = FastMoney.of(123456789, "USD"); // FastMoney is up to 5 decimal places Money total = amt1.add(amt2); // 錢(qián)表達(dá)成各國(guó)貨幣的方法: MonetaryAmountFormat germanFormat = MonetaryFormats.getAmountFormat( Locale.GERMANY); System.out.println(germanFormat.format(monetaryAmount)); // 1.202,12 USD
5. 改善鎖爭(zhēng)用機(jī)制
鎖爭(zhēng)用是限制許多Java多線(xiàn)程應(yīng)用性能的瓶頸. 新的機(jī)制在改善Java對(duì)象監(jiān)視器的性能方面已經(jīng)得到了多種基準(zhǔn)(benchmark)的驗(yàn)證, 其中包括Volano. 測(cè)試中通訊服務(wù)器開(kāi)放了海量的進(jìn)程來(lái)連接客戶(hù)端, 其中有很多連接都申請(qǐng)同一個(gè)資源, 以此模擬重負(fù)荷日常應(yīng)用.
通過(guò)諸如此類(lèi)的壓力測(cè)試我們可以估算JVM的極限吞吐量(每秒的消息數(shù)量). JEP在22種不同的測(cè)試中都得到了出色的成績(jī), 新的機(jī)制如果能在Java 9中得到應(yīng)用的話(huà), 應(yīng)用程序的性能將會(huì)大大提升.
6. 代碼分段緩存
Java 9的另一個(gè)性能提升來(lái)自于JIT(Just-in-time)編譯器. 當(dāng)某段代碼被大量重復(fù)執(zhí)行的時(shí)候, 虛擬機(jī)會(huì)把這段代碼編譯成機(jī)器碼(native code)并儲(chǔ)存在代碼緩存里面, 進(jìn)而通過(guò)訪問(wèn)緩存中不同分段的代碼來(lái)提升編譯器的效率.
和原來(lái)的單一緩存區(qū)域不同的是, 新的代碼緩存根據(jù)代碼自身的生命周期而分為三種:
- 永駐代碼(JVM 內(nèi)置 / 非方法代碼)
- 短期代碼(僅在某些條件下適用的配置性(profiled)代碼)
- 長(zhǎng)期代碼(非配置性代碼)
緩存分段會(huì)在各個(gè)方面提升程序的性能, 比如做垃圾回收掃描的時(shí)候可以直接跳過(guò)非方法代碼(永駐代碼), 從而提升效率.
7. 智能Java編譯, 第二階段
智能Java編譯工具sjavac的第一階段開(kāi)始于JEP 139這個(gè)項(xiàng)目, 用于在多核處理器上提升JDK的編譯速度. 現(xiàn)在這個(gè)項(xiàng)目已經(jīng)進(jìn)入第二階段(JEP 199), 目的是改進(jìn)sjavac并讓其成為取代目前JDK編譯工具javac的Java默認(rèn)的通用編譯工具.
其他值得期待的內(nèi)容:
8. HTTP 2.0客戶(hù)端
HTTP 2.0標(biāo)準(zhǔn)雖然還沒(méi)正式發(fā)布, 但是已經(jīng)進(jìn)入了最終審查階段, 預(yù)計(jì)可以在Java 9發(fā)布之前審查完畢. JEP 110將會(huì)重新定義并實(shí)現(xiàn)一個(gè)全新的Java HTTP客戶(hù)端, 用來(lái)取代現(xiàn)在的HttpURLConnection, 同時(shí)也會(huì)實(shí)現(xiàn)HTTP 2.0和網(wǎng)絡(luò)接口(原文websockets). 它現(xiàn)在還沒(méi)被JEP正式認(rèn)可但我們希望在Java 9中包含這一項(xiàng)目的內(nèi)容.
官方的HTTP 2.0 RFC(Request for Comments, 官方技術(shù)討論/會(huì)議記錄等等的一系列文檔記錄)預(yù)訂于2015年2月發(fā)布, 它是基于Google發(fā)布的SPDY(Speedy, 快速的)協(xié)議. 基于SPDY協(xié)議的網(wǎng)絡(luò)相對(duì)于基于HTTP 1.1協(xié)議的網(wǎng)絡(luò)有11.81%到47.7%之間的顯著提速, 現(xiàn)在已經(jīng)有瀏覽器實(shí)現(xiàn)了這個(gè)協(xié)議.
9. Kulla計(jì)劃: Java的REPL實(shí)現(xiàn)
這個(gè)取名為Kulla的項(xiàng)目最近宣布將于2015年4月整合測(cè)試, 雖然已經(jīng)不太有希望能趕上Java 9的發(fā)布, 但如果進(jìn)度快的話(huà)或許剛好能趕上. 現(xiàn)在Java并沒(méi)有來(lái)自官方的REPL(Read-Eval-Print-Loop)方式, 也就是說(shuō)現(xiàn)在如果你想要跑幾行Java代碼做一個(gè)快速的測(cè)試, 你仍然需要把這幾行代碼封裝在項(xiàng)目或者方法里面. 雖然在一些流行的IDE里面有Java REPL工具, 但它們并沒(méi)有官方支持, 而Kulla項(xiàng)目或許就能成為Java官方發(fā)布的REPL解決方案.
這些新功能出自何處?
JEP和JSR并不是無(wú)中生有, 下面就介紹一下Java發(fā)展的生態(tài)環(huán)境:
小組 - 對(duì)特定技術(shù)內(nèi)容, 比如安全, 網(wǎng)絡(luò), Swing, HotSpot, 有共同興趣的組織和個(gè)人
項(xiàng)目 - 編寫(xiě)代碼, 文檔以及其他工作, 至少由一個(gè)小組贊助和支持, 比如最近的Lambda計(jì)劃, Jigsaw計(jì)劃和Sumatra計(jì)劃.
JDK改進(jìn)提案(JEP) - 每當(dāng)需要有新的嘗試的時(shí)候, JEP可以在JCP(Java Community Process)之前或者同時(shí)提出非正式的規(guī)范(specification). 被正是認(rèn)可的JEP正式寫(xiě)進(jìn)JDK的發(fā)展路線(xiàn)圖并分配版本號(hào).
Java規(guī)范提案(JSR) - 新特性的規(guī)范出現(xiàn)在這一個(gè)階段, 可以來(lái)自于小組 / 項(xiàng)目, JEP, JCP成員或者Java社區(qū)(community)成員的提案. 每個(gè)Java版本都由相應(yīng)的JSR支持, Java 9暫時(shí)還沒(méi)有.
相關(guān)文章
SpringBoot搭建go-cqhttp機(jī)器人的方法實(shí)現(xiàn)
本文主要介紹了SpringBoot搭建go-cqhttp機(jī)器人的方法實(shí)現(xiàn)2021-12-12SpringBoot中@ConfigurationProperties注解實(shí)現(xiàn)配置綁定的三種方法
這篇文章主要介紹了SpringBoot中@ConfigurationProperties注解實(shí)現(xiàn)配置綁定的三種方法,文章內(nèi)容介紹詳細(xì)需要的小伙伴可以參考一下2022-04-04java自定義日志輸出文件(log4j日志文件輸出多個(gè)自定義日志文件)
打印日志的在程序中是必不可少的,如果需要將不同的日志打印到不同的地方,則需要定義不同的Appender,然后定義每一個(gè)Appender的日志級(jí)別、打印形式和日志的輸出路徑,下面看一個(gè)示例吧2014-01-01java實(shí)現(xiàn)頁(yè)面多查詢(xún)條件必選的統(tǒng)一處理思路
這篇文章主要為大家介紹了java實(shí)現(xiàn)頁(yè)面多查詢(xún)條件必選的統(tǒng)一處理思路詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Spring?AOP手寫(xiě)動(dòng)態(tài)代理代碼實(shí)例
這篇文章主要介紹了Spring?AOP手寫(xiě)動(dòng)態(tài)代理代碼實(shí)例,AOP我們知道,是在不修改源代碼的情況下,為代碼添加一些新功能的技術(shù),通過(guò)動(dòng)態(tài)代理,可以在不修改原始類(lèi)代碼的前提下,對(duì)方法進(jìn)行攔截和增強(qiáng),需要的朋友可以參考下2024-01-01@Scheduled注解不能同時(shí)執(zhí)行多個(gè)定時(shí)任務(wù)的解決方案
這篇文章主要介紹了@Scheduled注解不能同時(shí)執(zhí)行多個(gè)定時(shí)任務(wù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09