「是時候升級Java11了」 JDK11優勢和JDK選擇

java技術架構 發佈 2020-02-22T07:38:48+00:00

Java11的性能提升僅通過切換到 Java 11 就有 16% 的改進,這種改進可能是因為 Java 10 中引入了 JEP 307: Parallel Full GC for G1。

專注於Java領域優質技術,歡迎關注

作者:冷冷gg

Java8 商用收費

從2019年1月份開始,Oracle JDK 開始對 Java SE 8 之後的版本開始進行商用收費,確切的說是 8u201/202 之後的版本。如果你用 Java 開發的功能如果是用作商業用途的,如果還不想花錢購買的話,能免費使用的最新版本是 8u201/202。當然如果是個人客戶端或者個人開發者可以免費試用 Oracle JDK 所有的版本。

Java11 的性能提升

僅通過切換到 Java 11 就有 16% 的改進,這種改進可能是因為 Java 10 中引入了 JEP 307: Parallel Full GC for G1。

詳情請見Java 11 究竟比 8 快了多少?看看這個基準測試

從java 8到java 11變化一覽

說明:這裡面我們不會介紹全部特性,只會列舉部分作為開發者最關心的變化。

緊湊型的字符串

從Java 9開始 String 數據承載由 char[] 改為 byte[] 緊湊的字符串,在很多時候只包含Latin-1里的字符,這些字符可節省一半內存。

增強api

1.字符串增強 @since 11



2.集合增強

從Java 9 開始,jdk裡面就為集合(List、Set、Map)增加了of和copyOf方法。它們用來創建不可變集合。

  • of() @since 9
  • copyOf() @since 10

示例一:



示例二:



示例三:



注意:使用 of 和 copyOf 創建的集合為不可變集合,不能進行添加、刪除、替換、排序等操作,不然會報java.lang.UnsupportedOperationException異常,使用Set.of()不能出現重複元素、Map.of()不能出現重複key,否則回報java.lang.IllegalArgumentException。。

3.Stream增強 @since 9

Stream是Java 8 中的特性,在Java 9 中為其新增了4個方法:

3.1 ofNullable(T t)

此方法可以接收null來創建一個空流

// 以前
Stream.of(null); //報錯
// 現在
Stream.ofNullable(null);

3.2 takeWhile(Predicate<? super T> predicate)

此方法根據Predicate接口來判斷如果為true就 取出 來生成一個新的流,只要碰到false就終止,不管後邊的元素是否符合條件。

Stream<Integer> integerStream = Stream.of(6, 10, 11, 15, 20);
Stream<Integer> takeWhile = integerStream.takeWhile(t -> t % 2 == 0);
takeWhile.forEach(System.out::println); // 6,10

3.3 dropWhile(Predicate<? super T> predicate)

此方法根據Predicate接口來判斷如果為true就 丟棄 來生成一個新的流,只要碰到false就終止,不管後邊的元素是否符合條件。

Stream<Integer> integerStream = Stream.of(6, 10, 11, 15, 20);
Stream<Integer> takeWhile = integerStream.dropWhile(t -> t % 2 == 0);
takeWhile.forEach(System.out::println); //11,15,20

3.4 iterate重載

以前使用iterate方法生成無限流需要配合limit進行截斷

Stream<Integer> limit = Stream.iterate(1, i -> i + 1).limit(5);
limit.forEach(System.out::println); //1,2,3,4,5

現在重載後這個方法增加了個判斷參數

Stream<Integer> iterate = Stream.iterate(1, i -> i <= 5, i -> i + 1);
iterate.forEach(System.out::println); //1,2,3,4,5

4.Optional增強 @since 9

4.1 stream()

如果為空返回一個空流,如果不為空將Optional的值轉成一個流。



4.2 ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

個人感覺這個方法就是結合isPresent()對Else的增強,ifPresentOrElse 方法的用途是,如果一個 Optional 包含值,則對其包含的值調用函數 action,即 action.accept(value),這與 ifPresent 一致;與 ifPresent 方法的區別在於,ifPresentOrElse 還有第二個參數 emptyAction —— 如果 Optional 不包含值,那麼 ifPresentOrElse 便會調用 emptyAction,即 emptyAction.run()。



4.3 or(Supplier<? extends Optional<? extends T>> supplier)



5.InputStream增強 @since 9



HTTP Client API

改api支持同步和異步兩種方式,下面是兩種方式的示例:



移除內容

  • com.sun.awt.AWTUtilities。
  • sun.misc.Unsafe.defineClass 使用java.lang.invoke.MethodHandles.Lookup.defineClass來替代。
  • Thread.destroy() 以及 Thread.stop(Throwable) 方法。
  • sun.nio.ch.disableSystemWideOverlappingFileLockCheck 屬性。
  • sun.locale.formatasdefault 屬性。
  • jdk snmp 模塊。
  • javafx,openjdk 是從java10版本就移除了,oracle java10還尚未移除javafx ,而java11版本將javafx也移除了。
  • Java Mission Control,從JDK中移除之後,需要自己單獨下載。
  • Root Certificates :Baltimore Cybertrust Code Signing CA,SECOM ,AOL and Swisscom。
  • 在java11中將java9標記廢棄的Java EE及CORBA模塊移除掉。

完全支持Linux容器(包括docker)

許多運行在Java虛擬機中的應用程式(包括Apache Spark和Kafka等數據服務以及傳統的企業應用程式)都可以在Docker容器中運行。但是在Docker容器中運行Java應用程式一直存在一個問題,那就是在容器中運行JVM程序在設置內存大小和CPU使用率後,會導致應用程式的性能下降。這是因為Java應用程式沒有意識到它正在容器中運行。隨著Java 10的發布,這個問題總算得以解決,JVM現在可以識別由容器控制組(cgroups)設置的約束。可以在容器中使用內存和CPU約束來直接管理Java應用程式,其中包括:

  • 遵守容器中設置的內存限制
  • 在容器中設置可用的CPU
  • 在容器中設置CPU約束

JDK推薦

由於 Java 11 開始,Oracle 提供的是付費支持的商業版本。筆者在這更加推薦使用亞馬遜的 Corretto,Corretto 採用 GPL 協議。

Corretto的長期支持(LTS)包括Corretto 8的性能增強和安全更新,至少在2023年6月之前免費提供。 更新計劃每季度發布一次。

亞馬遜將為Corretto 11提供LTS的季度更新,至少持續到2024年8月。

Github 下載地址:「連結」

聲明

本系列文章由微服務核心組件mica作者如夢技術共同整理撰寫, 如有參考或者轉載,請保留原作者和註明出處。

來源:掘金 連結:https://juejin.im/post/5e4df461e51d4526cd1de49a

關鍵字: