Java11新特性概览
一、JShell(java9已經(jīng)開始支持)
1、類似于python中的求值-打印循環(huán)(Read-Evaluaction-Print Loop),目的在與即時(shí)結(jié)果和反饋
2、java9引入了shell這個(gè)交互性工具,讓java也可以像腳本語言一樣來運(yùn)行,可以從控制臺(tái)啟動(dòng)jshell,在jshell中直接輸入表達(dá)式并查看其執(zhí)行結(jié)果,當(dāng)需要測(cè)試一個(gè)方法的運(yùn)行效果或是快速的對(duì)表達(dá)式進(jìn)行求值時(shí),jshell都非常實(shí)用
3、除了表達(dá)式外,還可以創(chuàng)建java類和方法。jshell也有 基本的代碼完成,不在需要解釋必須有public static void main(String[] args)這句話
4、使用方式:
- 直接寫代碼片段即可調(diào)用
- 打開java文件使用
5、常見命令:
/help查看幫助二、Dynamic Class-File constants類文件新添的一種結(jié)構(gòu)
1、java的類型文件格式將被拓展,支持一種新的常量池格式:CONSTANT Dynamic加載CONSTANT Dynamic會(huì)將創(chuàng)建委托給bootstrap方法
目標(biāo):其目標(biāo)是降低開發(fā)新形式的可實(shí)現(xiàn)類文件約束帶來的成本和干擾
三、局部變量類型推斷(var關(guān)鍵字)
1、什么是局部變量類型推斷
局部變量類型推斷指的是java不在需要給變量定義具體的數(shù)據(jù)類型而是使用var來定義,編譯器能根據(jù)右邊表達(dá)式自動(dòng)推斷類型,例如
var str = "java";就相當(dāng)于 String str = "java"
注意:使用var語法必須進(jìn)行初始化,因?yàn)関ar需要根據(jù)右側(cè)進(jìn)行類型判斷
2、作用在lambda表達(dá)式上可以使用注解 (@NoneNull var a)->{ XXX }
四、java11新的API
1、集合的創(chuàng)建以更簡單的方式初始化
List list = new ArrayLiist<>();list.add("a");list.add("b");可直接改寫為:
List list = List.of("a","b");注意這里返回的list不是java.util下的list 不可繼續(xù)add元素
Set集合類似
2、Stream的改變
Stream.ofNullable(null);//創(chuàng)建流的時(shí)候可傳入null 防止出現(xiàn)空指針異常Stream.takeWhile(Predicate);//從流中獲取判定為真的元素,判定為假的時(shí)候 就停止判定Stream.dropWhile(Predicate);//從流中獲取為假的元素,判定為真丟棄,直到判定為假,停止判定Stream.iterate(1,t->tt*3+1);//無限流通過中間的判斷創(chuàng)建有限流3、String函數(shù)新增和改變
isBlank()判斷字符串是否為空白 包括空格回車 空字符串strip()去除字符串首尾空白 對(duì)比trim(),trim()只能去除unicode碼值小于32的字符 如漢字空格,所以strip()是對(duì)trim()的增強(qiáng)stripTrailing()去除尾部空白stripLeading()去除首部空白repeat(count);復(fù)制字符串count次lines().count();行數(shù)統(tǒng)計(jì) lines返回一個(gè)Stream4、inputStream加強(qiáng)方法transferTo(os)直接把輸入流交給輸出流就可完成復(fù)制文件
五、標(biāo)準(zhǔn)java異步Http客戶端
java的http工具不在依賴第三方,java本身封裝的api
六、java執(zhí)行源文件可不再編譯
注意:執(zhí)行源文件中的第一個(gè)類(第一個(gè)類必須包括主方法),并且不可以使用其他源文件中的自定義類(不可跨文件操作)
七、垃圾收集器
1、新的Epsilon垃圾收集器
A NoOp Garbage Collector
JDK上對(duì)這個(gè)特性的描述是:開發(fā)一個(gè)處理內(nèi)存分配但是不實(shí)現(xiàn)任何實(shí)際內(nèi)存回收機(jī)制的GC,一旦可用堆內(nèi)粗用戶,JVM就會(huì)退出
如果有System.gc()調(diào)用,實(shí)際上什么也不會(huì)發(fā)生(這種場(chǎng)景下和-XX:DisableExplicitGc效果一樣),因?yàn)闆]有內(nèi)存回收,這個(gè)實(shí)現(xiàn)可能會(huì)警告用戶強(qiáng)制GC是徒勞的
用法:-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
使用原因:
提供完全被動(dòng)的GC實(shí)現(xiàn),具有有限的分配限制和盡可能低的延遲開銷,但代價(jià)是內(nèi)存占用和內(nèi)存吞吐量
java實(shí)現(xiàn)可廣泛選擇高度可配置的GC是,各種可用的收集器最終滿足不同的需求,即是它們的可配置性使他們的功能相交,有時(shí)更容易維護(hù)單獨(dú)的實(shí)現(xiàn),而不是在現(xiàn)有GC實(shí)現(xiàn)上堆積另一個(gè)配置選項(xiàng)
主要用途:
性能測(cè)試(它可以幫助過濾掉GC引起的性能假象)
內(nèi)存壓力測(cè)試(例如,知道測(cè)試用例 應(yīng)該分配不超過1GB的內(nèi)存,我們可以使用-Xxx1g -XX:+UseEpsilonGc,如果程序有問題那么就會(huì)崩潰)
非常短的job任務(wù)(對(duì)象這種任務(wù),接受GC清理堆都是浪費(fèi)空間)
VM接口測(cè)試:
Last-drop 延遲&吞吐改進(jìn)
2、ZGC垃圾收集器
ZGC,A Scalable Low-Latency Garbage Collector(Experimental)
ZGC是jdk11最為矚目的特性,但是后面帶了Experimental,說明不建議用到生產(chǎn)環(huán)境
優(yōu)點(diǎn):
GC暫停時(shí)間不超過10ms
即能處理幾百兆的小堆也能處理幾個(gè)T的大堆
和G1相比應(yīng)用吞吐能力不會(huì)下降超過15%
為未來GC功能和利用colord指針以及Load barriers優(yōu)化奠定基礎(chǔ) 初始只支持64位系統(tǒng)
ZGC的設(shè)計(jì)目標(biāo)是:支持TB級(jí)別內(nèi)存容量,暫停時(shí)間低,對(duì)整個(gè)程序吞吐量影響小于15%,將來還可以擴(kuò)展實(shí)現(xiàn)機(jī)制,以支持不少令人興奮的功能,例如多層堆(即熱對(duì)象置于DRAM和冷對(duì)象置于NVMe閃存)或壓縮堆
GC是java的主要優(yōu)勢(shì)之一,然而當(dāng)GC停頓太長,就會(huì)開始影響應(yīng)用的響應(yīng)時(shí)間,消除或減少GC停頓時(shí)常,Java將堆更廣泛的應(yīng)用場(chǎng)景是一個(gè)更有吸引力的平臺(tái),此外,現(xiàn)代系統(tǒng)中可用內(nèi)存不斷增長,用戶和程序員之間希望JVM能夠以搞笑的方式充分利用這些內(nèi)存,并且無須長時(shí)間的GC暫停時(shí)間
ZGC是一個(gè)并發(fā),基于region壓縮型的垃圾收集器,只有root掃描階段會(huì)STW(stop the world),因此GC停頓時(shí)間不會(huì)隨著堆的增長和存貨對(duì)象的增長而變長
ZGC : avg 1.091ms max 1.681ms
G1 : avg 156.806ms max 543.846ms
用法: --XX:+UnlockExperimentalVMotions -XX:+UseZGC ,因?yàn)閆GC還處于實(shí)驗(yàn)階段,所以需要通過jvm參數(shù)來解鎖這個(gè)特性
八、FightRecorder java黑匣子
Fight Recorder 以前是商業(yè)版的特性,在java11中開源出來,它可以導(dǎo)出事件到文件中,之后可以用Java Mission Conrol來分析,可以在應(yīng)用啟動(dòng)時(shí)配置 java -XX:StartFightRecording或者在應(yīng)用程序啟動(dòng)后使用jcmd來錄制比如
$ jcmd JFR.start$ jcmd JFR.dump filename=recording.jfr$ jcmd JFR.stop是oracle剛開源的強(qiáng)大特性,jfr性能最大開銷不超過1%
總結(jié):雖然java11更新已經(jīng)有些時(shí)間了,但是目前國內(nèi)在用的公司并不多。java11后續(xù)也將是Oracle公司持續(xù)支持的一個(gè)版本,強(qiáng)大的G1垃圾收集器目前也處于適應(yīng)性階段,相信當(dāng)java11廣泛出線在中國市場(chǎng)的時(shí)候,Java行業(yè)會(huì)產(chǎn)生一些顛覆性的事件,筆者也并未深入研究,本文只是筆者通過學(xué)習(xí)做的一個(gè)簡單的概要,后續(xù)深入了解后會(huì)繼續(xù)補(bǔ)充本文。
總結(jié)
以上是生活随笔為你收集整理的Java11新特性概览的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里软件测试工程师手把手教学:自动化脚本
- 下一篇: java 监视锁_【转载】Java锁与