JDK11新特性詳解
1、增強區域性變數型別推斷var
Consumer<String> consumer = t -> System.out.println(t.toUpperCase()); Consumer<String> consumer = (var t) -> System.out.println(t.toUpperCase()); 錯誤的形式:必須要有型別,可以加上var Consumer<String> consumer = (@Deprecated t) ->System.out.println(t.toUpperCase()) 正確的形式 Consumer<String> consumer = (@Deprecated var t) ->System.out.println(t.toUpperCase())
2、增加一些實用的API
自JDK9和JDK10都為java增加了許多的API,如今JDK11又增加了許多字串自帶方法,如下
@Test public void contextLoads() { String str = "woshidage"; boolean isblank = str.isBlank(); //判斷字串是空白 boolean isempty = str.isEmpty(); //判斷字串是否為空 String result1 = str.strip(); //首位空白 String result2 = str.stripTrailing(); //去除尾部空白 String result3 = str.stripLeading(); //去除首部空白 String copyStr = str.repeat(2); //複製幾遍字串 long lineCount = str.lines().count(); //行數統計 System.out.println(isblank); System.out.println(isempty); System.out.println(result1); System.out.println(result2); System.out.println(result3); System.out.println(copyStr); System.out.println(lineCount); }
結果為:
3、移除和廢棄的內容
3.1 移除項
1、移除了com.sun.awt.AWTUtilities 2、移除了sun.misc.Unsafe.defineClass,使用java.lang.invoke.MethodHandles.Lookup.defineClass來替代 3、移除了Thread.destroy()以及 Thread.stop(Throwable)方法 4、移除了sun.nio.ch.disableSystemWideOverlappingFileLockCheck、sun.locale.formatasdefault屬性 5、移除了jdk.snmp模組 6、移除了javafx,openjdk估計是從java10版本就移除了,oracle jdk10還尚未移除javafx,而java11版本則oracle的jdk版本也移除了javafx 7、移除了Java Mission Control,從JDK中移除之後,需要自己單獨下載 8、移除了這些Root Certificates :Baltimore Cybertrust Code Signing CA,SECOM ,AOL and Swisscom
3.2 廢棄項
1、-XX+AggressiveOpts選項 2、-XX:+UnlockCommercialFeatures 3、-XX:+LogCommercialFeatures選項也不再需要
4、HttpClient加強方法
現在 Java 自帶了這個 HTTP Client API,我們以後還有必要用 Apache 的 HttpClient 工具包嗎?
4.1 需要遠端呼叫的介面
@RequestMapping(value = "/dshjbca") public String test1(){ return "dfs"; }
4.2 HttpClient呼叫該介面
//同步呼叫 @Test public void test2() throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder(URI.create("")).build(); BodyHandler<String> handler = HttpResponse.BodyHandlers.ofString(); HttpResponse<String> response = client.send(request,handler); String body = response.body(); System.out.println(body); } //非同步呼叫 @Test public void test3() throws IOException, InterruptedException, ExecutionException { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder(URI.create("")).build(); BodyHandler<String> handler = HttpResponse.BodyHandlers.ofString(); CompletableFuture<HttpResponse<String>> response = client.sendAsync(request,handler); HttpResponse<String> result = response.get(); String body = result.body(); System.out.println(body); }
結果:
5、Unicode 10
Unicode 10 增加了 8518 個字元 , 總計達到了 136690 個字元 . 並且增加了 4 個指令碼 . 同時還有 56 個新的 emoji 表情符號。
6、Remove the JavaEE and CORBA Moudles
在java11中移除了不太使用的JavaEE模組和CORBA技術,在java11中將java9標記廢棄的Java EE及CORBA模組移除掉。
1、java.xml.ws, 2、java.xml.bind, 3、java.xml.ws, 4、java.xml.ws.annotation, 5、jdk.xml.bind, 6、jdk.xml.ws被移除, 只剩下java.xml,java.xml.crypto,jdk.xml.dom這幾個模組 7、java.corba, 8、java.se.ee, 9、java.activation, 10、java.transaction被移除,但是java11新增一個java.transaction.xa模組
7、JEP : 335 : Deprecate the Nashorn JavaScript Engine
廢除Nashorn javascript引擎,在後續版本準備移除掉,有需要的可以考慮使用GraalVM。
8、JEP : 336 : Deprecate the Pack200 Tools and API
Java5中帶了一個壓縮工具:Pack200,這個工具能對普通的jar檔案進行高效壓縮。其 實現原理是根據Java類特有的結構,合併常數 池,去掉無用資訊等來實現對java類的高效壓縮。由於是專門對Java類進行壓縮的,所以對普通檔案的壓縮和普通壓縮軟體沒有什麼兩樣,但是對於Jar 檔案卻能輕易達到10-40%的壓縮率。這在Java應用部署中很有用,尤其對於移動Java計算,能夠大大減小程式碼下載量。
Java5中還提供了這一技術的API介面,你可以將其嵌入到你的程式中使用。使用的方法很簡單,下面的短短几行程式碼即可以實現jar的壓縮和解壓:
壓縮
Packer packer=Pack200.newPacker(); OutputStream output=new BufferedOutputStream(new FileOutputStream(outfile)); packer.pack(new JarFile(jarFile), output); output.close();
解壓
Unpacker unpacker=Pack200.newUnpacker(); output=new JarOutputStream(new FileOutputStream(jarFile)); unpacker.unpack(pack200File, output); output.close();
Pack200的壓縮和解壓縮速度是比較快的,而且壓縮率也是很驚人的,在我是使用 的包4.46MB壓縮後成了1.44MB(0.322%),而且隨著包的越大壓縮率會根據明顯,據說如果jar包都是class類可以壓縮到1/9的大 小。其實JavaWebStart還有很多功能,例如可以按不同的jar包進行lazy下載和 單獨更新,設定可以根據jar中的類變動進行class粒度的下載。但是在java11中廢除了pack200以及unpack200工具以及java.util.jar中的Pack200 API。因為Pack200主要是用來壓縮jar包的工具,由於網路下載速度的提升以及java9引入模組化系統之後不再依賴Pack200,因此這個版本將其移除掉。
9、新的Epsilon垃圾收集器
A NoOp Garbage Collector JDK上對這個特性的描述是: 開發一個處理記憶體分配但不實現任何實際記憶體回收機制的GC, 一旦可用堆記憶體用完, JVM就會退出.
如果有System.gc()呼叫, 實際上什麼也不會發生(這種場景下和-XX:+DisableExplicitGC效果一樣), 因為沒有記憶體回收, 這個實現可能會警告使用者嘗試強制GC是徒勞.
用法 : -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
選項-XX:+UseEpsilonGC, 程式很快就因為堆空間不足而退出
原因 : 提供完全被動的GC 實現 , 具有有限的分配限制和儘可能低的延遲開銷 , 但代價是記憶體佔用和記憶體吞吐量 , java 實現可廣泛選擇高度可配置的 GC 實現 . 各種可用的收集器最終滿足不同的需求 , 即使它們的可配置性使它們的功能相交 . 有時更容易維護單獨的實現 , 而不是在現有 GC 實現上堆積另一個配置選項 .
主要用途如下 :
1、效能測試(它可以幫助過濾掉GC引起的效能假象)2、記憶體壓力測試(例如,知道測試用例 應該分配不超過1GB的記憶體, 我們可以使用-Xmx1g –XX:+UseEpsilonGC, 如果程式有問題, 則程式會崩潰)3、非常短的JOB任務(物件這種任務, 接受GC清理堆那都是浪費空間)4、VM介面測試5、Last-drop 延遲&吞吐改進
10、ZGC
ZGC, 這應該是JDK11最為矚目的特性, 沒有之一. 但是後面帶了Experimental, 說明這還不建議用到生產環境。 GC暫停時間不會超過10ms,既能處理幾百兆的小堆, 也能處理幾個T的大堆(OMG),和G1相比, 應用吞吐能力不會下降超過15%,為未來的GC功能和利用colord指標以及Load barriers優化奠定基礎,初始只支援64位系統 ZGC的設計目標是:支援TB級記憶體容量,暫停時間低(<10ms),對整個程式吞吐量的影響小於15%。 將來還可以擴充套件實現機制,以支援不少令人興奮的功能,例如多層堆(即熱物件置於DRAM和冷物件置於NVMe快閃記憶體),或壓縮堆。 GC是java主要優勢之一,當GC停頓太長, 就會開始影響應用的響應時間.消除或者減少GC停頓時長, java將對更廣泛的應用場景是一個更有吸引力的平臺. 此外, 現代系統中可用記憶體不斷增長,使用者和程式設計師希望JVM能夠以高效的方式充分利用這些記憶體, 並且無需長時間的GC暫停時間
用法 : -XX:+UnlockExperimentalVMOptions –XX:+UseZGC, 因為ZGC還處於實驗階段, 所以需要通過JVM引數來解鎖這個特性
11、完全支援Linux容器(包括Docker)
許多執行在Java虛擬機器中的應用程式(包括Apache Spark和Kafka等資料服務以及傳統的企業應用程式)都可以在Docker容器中執行。但是在Docker容器中執行Java應用程式一直存在一個問題,那就是在容器中執行JVM程式在設定記憶體大小和CPU使用率後,會導致應用程式的效能下降。這是因為Java應用程式沒有意識到它正在容器中執行。隨著Java 10的釋出,這個問題總算得以解決,JVM現在可以識別由容器控制組(cgroups)設定的約束。可以在容器中使用記憶體和CPU約束來直接管理Java應用程式,其中包括:
遵守容器中設定的記憶體限制 在容器中設定可用的CPU 在容器中設定CPU約束 Java 10的這個改進在Docker for Mac、Docker for Windows以及Docker Enterprise Edition等環境均有效。 容器的記憶體限制 在Java 9之前,JVM無法識別容器使用標誌設定的記憶體限制和CPU限制。而在Java 10中,記憶體限制會自動被識別並強制執行。Java將伺服器類機定義為具有2個CPU和2GB記憶體,以及預設堆大小為實體記憶體的1/4。
12、支援G1上的並行完全垃圾收集
對於 G1 GC ,相比於 JDK 8 ,升級到 JDK 11 即可免費享受到:並行的 Full GC ,快速的 CardTable 掃描,自適應的堆佔用比例調整( IHOP ),在併發標記階段的型別解除安裝等等。這些都是針對 G1 的不斷增強,其中序列 Full GC 等甚至是曾經被廣泛詬病的短板,你會發現 GC 配置和調優在 JDK11 中越來越方便。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-2674129/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JDK11新特性學習(二)JDK
- JDK11新特性學習(一)JDK
- Android Studio 新特性詳解Android
- 詳解C#7.0新特性C#
- JDK8新特性詳解JDK
- JDK9新特性詳解JDK
- JDK10新特性詳解JDK
- JDK12新特性詳解JDK
- JDK13新特性詳解JDK
- Java8 新特性詳解Java
- JDK8新特性詳解(二)JDK
- JDK8新特性詳解(一)JDK
- 收藏版:《JDK13新特性詳解》JDK
- Oracle 18c新特性詳解 - 表和表空間相關的新特性Oracle
- java JDK1.7版本新特性詳解JavaJDK
- Dubbo3詳解(5大新特性及功能圖解)圖解
- Oracle 18c新特性詳解:In-Memory 專題Oracle
- Java9 新特性彙總——基於 JDK11 程式碼彙總。。。更新中JavaJDK
- C#–特性詳解C#
- Oracle 18c新特性詳解-多租戶專題Oracle
- Win10 Build 17692釋出 7個新特性詳解Win10UI
- Swift 5新特性詳解:ABI 穩定終於來了!Swift
- 全面煥新|詳解 Grafana v9.0.x 新增功能特性Grafana
- ES10特性詳解
- 顯微鏡下的webpack4的新特性:mode詳解Web
- SpreadJS 類Excel表格控制元件 - V12 新特性詳解JSExcel控制元件
- 整理了一份php8新特性詳解pdf文件PHP
- Kubernetes 1.24新特性解讀
- 蒲公英 · JELLY技術週刊 Vol.14: Vue 3 新特性詳解Vue
- React 16 新特性全解(上)React
- Python 3.8 新特性全面解讀Python
- Apache Kyuubi 1.6.0 新特性解讀Apache
- C# 9.0新特性詳解系列之三:模組初始化器C#
- 詳解C#特性和反射(四)C#反射
- 詳解C#特性和反射(三)C#反射
- 詳解C#特性和反射(二)C#反射
- 詳解C#特性和反射(一)C#反射
- vue-cli 3.0新特性解讀Vue