最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java13 明天發(fā)布(最新最全新特性解讀)

 更新時(shí)間:2019年09月16日 16:39:18   作者:Hollis在csdn  
這篇文章主要介紹了Java13 明天發(fā)布,最新最全新特性解讀,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

2017年8月,JCP執(zhí)行委員會提出將Java的發(fā)布頻率改為每六個(gè)月一次,新的發(fā)布周期嚴(yán)格遵循時(shí)間點(diǎn),將在每年的3月份和9月份發(fā)布。

目前,JDK官網(wǎng)上已經(jīng)可以看到JDK 13的進(jìn)展,最新版的JDK 13將于2019年9月17日發(fā)布。

目前,JDK13處于Release-Candidate Phase(發(fā)布候選階段),將于9月17日正式發(fā)布。目前該版本包含的特性已經(jīng)全部固定,主要包含以下五個(gè):

JEP 350,Dynamic CDS Archives

JEP 351,ZGC: Uncommit Unused Memory

JEP 353,Reimplement the Legacy Socket API

JEP 354: Switch Expressions (Preview)

JEP 355,Text Blocks (Preview)

下面來逐一介紹下這五個(gè)重要的特性。

Dynamic CDS Archives

這一特性是在JEP310:Application Class-Data Sharing基礎(chǔ)上擴(kuò)展而來的,Dynamic CDS Archives中的CDS指的就是Class-Data Sharing。

那么,這個(gè)JEP310是個(gè)啥東西呢?

我們知道在同一個(gè)物理機(jī)/虛擬機(jī)上啟動多個(gè)JVM時(shí),如果每個(gè)虛擬機(jī)都單獨(dú)裝載自己需要的所有類,啟動成本和內(nèi)存占用是比較高的。所以Java團(tuán)隊(duì)引入了CDS的概念,通過把一些核心類在每個(gè)JVM間共享,每個(gè)JVM只需要裝載自己的應(yīng)用類,啟動時(shí)間減少了,另外核心類是共享的,所以JVM的內(nèi)存占用也減少了。

CDS 只能作用于 Boot Class Loader 加載的類,不能作用于 App Class Loader 或者自定義的 Class Loader 加載的類。

在 Java 10 中,則將 CDS 擴(kuò)展為 AppCDS,顧名思義,AppCDS 不止能夠作用于 Boot Class Loader了,App Class Loader 和自定義的 Class Loader 也都能夠起作用,大大加大了 CDS 的適用范圍。也就說開發(fā)自定義的類也可以裝載給多個(gè)JVM共享了。

Java 10中包含的JEP310的通過跨不同Java進(jìn)程共享公共類元數(shù)據(jù)來減少了內(nèi)存占用和改進(jìn)了啟動時(shí)間。

但是,JEP310中,使用AppCDS的過程還是比較復(fù)雜的,需要有三個(gè)步驟:

1、決定要 Dump 哪些 Class
2、將類的內(nèi)存 Dump 到歸檔文件中
3、使用 Dump 出來的歸檔文件加快應(yīng)用啟動速度

這一次的JDK 13中的JEP 350 ,在JEP310的基礎(chǔ)上,又做了一些擴(kuò)展。允許在Java應(yīng)用程序執(zhí)行結(jié)束時(shí)動態(tài)歸檔類,歸檔類將包括默認(rèn)的基礎(chǔ)層 CDS(class data-sharing)存檔中不存在的所有已加載的應(yīng)用程序類和庫類。

也就是說,在Java 13中再使用AppCDS的時(shí)候,就不在需要這么復(fù)雜了。

ZGC: Uncommit Unused Memory

在討論這個(gè)問題之前,想先問一個(gè)問題,JVM的GC釋放的內(nèi)存會還給操作系統(tǒng)嗎?

GC后的內(nèi)存如何處置,其實(shí)是取決于不同的垃圾回收器的。因?yàn)榘褍?nèi)存還給OS,意味著要調(diào)整JVM的堆大小,這個(gè)過程是比較耗費(fèi)資源的。

在JDK 11中,Java引入了ZGC,這是一款可伸縮的低延遲垃圾收集器,但是當(dāng)時(shí)只是實(shí)驗(yàn)性的。并且,ZGC釋放的內(nèi)存是不會還給操作系統(tǒng)的。

而在Java 13中,JEP 351再次對ZGC做了增強(qiáng),本次 ZGC 可以將未使用的堆內(nèi)存返回給操作系統(tǒng)。之所以引入這個(gè)特性,是因?yàn)槿缃裼泻芏鄨鼍爸袃?nèi)存是比較昂貴的資源,在以下情況中,將內(nèi)存還給操作系統(tǒng)還是很有必要的:

1、那些需要根據(jù)使用量付費(fèi)的容器

2、應(yīng)用程序可能長時(shí)間處于空閑狀態(tài)并與許多其他應(yīng)用程序共享或競爭資源的環(huán)境。

3、應(yīng)用程序在執(zhí)行期間可能有非常不同的堆空間需求。例如,啟動期間所需的堆可能大于稍后在穩(wěn)定狀態(tài)執(zhí)行期間所需的堆。

Reimplement the Legacy Socket API

使用易于維護(hù)和調(diào)試的更簡單、更現(xiàn)代的實(shí)現(xiàn)替換 java.net.Socket 和 java.net.ServerSocket API。

java.net.Socket和java.net.ServerSocket的實(shí)現(xiàn)非常古老,這個(gè)JEP為它們引入了一個(gè)現(xiàn)代的實(shí)現(xiàn)?,F(xiàn)代實(shí)現(xiàn)是Java 13中的默認(rèn)實(shí)現(xiàn),但是舊的實(shí)現(xiàn)還沒有刪除,可以通過設(shè)置系統(tǒng)屬性jdk.net.usePlainSocketImpl來使用它們。

運(yùn)行一個(gè)實(shí)例化Socket和ServerSocket的類將顯示這個(gè)調(diào)試輸出。這是默認(rèn)的(新的):

java -XX: TraceClassLoading JEP353 | grep Socket
[0.033s][info  ][class,load] java.net.Socket source: jrt:/java.base
[0.035s][info  ][class,load] java.net.SocketOptions source: jrt:/java.base
[0.035s][info  ][class,load] java.net.SocketImpl source: jrt:/java.base
[0.039s][info  ][class,load] java.net.SocketImpl$$Lambda$1/0x0000000800b50840 source: java.net.SocketImpl
[0.042s][info  ][class,load] sun.net.PlatformSocketImpl source: jrt:/java.base
[0.042s][info  ][class,load] sun.nio.ch.NioSocketImpl source: jrt:/java.base
[0.043s][info  ][class,load] sun.nio.ch.SocketDispatcher source: jrt:/java.base
[0.044s][info  ][class,load] java.net.DelegatingSocketImpl source: jrt:/java.base
[0.044s][info  ][class,load] java.net.SocksSocketImpl source: jrt:/java.base
[0.044s][info  ][class,load] java.net.ServerSocket source: jrt:/java.base
[0.045s][info  ][class,load] jdk.internal.access.JavaNetSocketAccess source: jrt:/java.base
[0.045s][info  ][class,load] java.net.ServerSocket$1 source: jrt:/java.base

上面輸出的sun.nio.ch.NioSocketImpl就是新提供的實(shí)現(xiàn)。

如果使用舊的實(shí)現(xiàn)也是可以的(指定參數(shù)jdk.net.usePlainSocketImpl):

$ java -Djdk.net.usePlainSocketImpl -XX: TraceClassLoading JEP353 | grep Socket
[0.037s][info  ][class,load] java.net.Socket source: jrt:/java.base
[0.039s][info  ][class,load] java.net.SocketOptions source: jrt:/java.base
[0.039s][info  ][class,load] java.net.SocketImpl source: jrt:/java.base
[0.043s][info  ][class,load] java.net.SocketImpl$$Lambda$1/0x0000000800b50840 source: java.net.SocketImpl
[0.046s][info  ][class,load] sun.net.PlatformSocketImpl source: jrt:/java.base
[0.047s][info  ][class,load] java.net.AbstractPlainSocketImpl source: jrt:/java.base
[0.047s][info  ][class,load] java.net.PlainSocketImpl source: jrt:/java.base
[0.047s][info  ][class,load] java.net.AbstractPlainSocketImpl$1 source: jrt:/java.base
[0.047s][info  ][class,load] sun.net.ext.ExtendedSocketOptions source: jrt:/java.base
[0.047s][info  ][class,load] jdk.net.ExtendedSocketOptions source: jrt:/jdk.net
[0.047s][info  ][class,load] java.net.SocketOption source: jrt:/java.base
[0.047s][info  ][class,load] jdk.net.ExtendedSocketOptions$ExtSocketOption source: jrt:/jdk.net
[0.047s][info  ][class,load] jdk.net.SocketFlow source: jrt:/jdk.net
[0.047s][info  ][class,load] jdk.net.ExtendedSocketOptions$PlatformSocketOptions source: jrt:/jdk.net
[0.047s][info  ][class,load] jdk.net.ExtendedSocketOptions$PlatformSocketOptions$1 source: jrt:/jdk.net
[0.048s][info  ][class,load] jdk.net.LinuxSocketOptions source: jrt:/jdk.net
[0.048s][info  ][class,load] jdk.net.LinuxSocketOptions$$Lambda$2/0x0000000800b51040 source: jdk.net.LinuxSocketOptions
[0.049s][info  ][class,load] jdk.net.ExtendedSocketOptions$1 source: jrt:/jdk.net
[0.049s][info  ][class,load] java.net.StandardSocketOptions source: jrt:/java.base
[0.049s][info  ][class,load] java.net.StandardSocketOptions$StdSocketOption source: jrt:/java.base
[0.051s][info  ][class,load] sun.net.ext.ExtendedSocketOptions$$Lambda$3/0x0000000800b51440 source: sun.net.ext.ExtendedSocketOptions
[0.057s][info  ][class,load] java.net.DelegatingSocketImpl source: jrt:/java.base
[0.057s][info  ][class,load] java.net.SocksSocketImpl source: jrt:/java.base
[0.058s][info  ][class,load] java.net.ServerSocket source: jrt:/java.base
[0.058s][info  ][class,load] jdk.internal.access.JavaNetSocketAccess source: jrt:/java.base
[0.058s][info  ][class,load] java.net.ServerSocket$1 source: jrt:/java.base

上面的結(jié)果中,舊的實(shí)現(xiàn)java.net.PlainSocketImpl被用到了。

Switch Expressions (Preview)

在JDK 12中引入了Switch表達(dá)式作為預(yù)覽特性。JEP 354修改了這個(gè)特性,它引入了yield語句,用于返回值。這意味著,switch表達(dá)式(返回值)應(yīng)該使用yield, switch語句(不返回值)應(yīng)該使用break。

在以前,我們想要在switch中返回內(nèi)容,還是比較麻煩的,一般語法如下:

int i;
switch (x) {
  case "1":
    i=1;
    break;
  case "2":
    i=2;
    break;
  default:
    i = x.length();
    break;
}

在JDK13中使用以下語法:

int i = switch (x) {
  case "1" -> 1;
  case "2" -> 2;
  default -> {
    int len = args[1].length();
    yield len;
  }
};

或者

int i = switch (x) {
  case "1": yield 1;
  case "2": yield 2;
  default: {
    int len = args[1].length();
    yield len;
  }
};

在這之后,switch中就多了一個(gè)關(guān)鍵字用于跳出switch塊了,那就是yield,他用于返回一個(gè)值。和return的區(qū)別在于:return會直接跳出當(dāng)前循環(huán)或者方法,而yield只會跳出當(dāng)前switch塊。

Text Blocks (Preview)

在JDK 12中引入了Raw String Literals特性,但在發(fā)布之前就放棄了。這個(gè)JEP在引入多行字符串文字(text block)在意義上是類似的。

text block,文本塊,是一個(gè)多行字符串文字,它避免了對大多數(shù)轉(zhuǎn)義序列的需要,以可預(yù)測的方式自動格式化字符串,并在需要時(shí)讓開發(fā)人員控制格式。

我們以前從外部copy一段文本串到Java中,會被自動轉(zhuǎn)義,如有一段以下字符串:

 <html>
 <body>
   <p>Hello, world</p>
 </body>
</html>

將其復(fù)制到Java的字符串中,會展示成以下內(nèi)容:

"<html>\n" 
"  <body>\n" 
"    <p>Hello, world</p>\n" 
"  </body>\n" 
"</html>\n";

即被自動進(jìn)行了轉(zhuǎn)義,這樣的字符串看起來不是很直觀,在JDK 13中,就可以使用以下語法了:

"""
<html>
 <body>
   <p>Hello, world</p>
 </body>
</html>
""";

使用“”“作為文本塊的開始符合結(jié)束符,在其中就可以放置多行的字符串,不需要進(jìn)行任何轉(zhuǎn)義??雌饋砭褪智逅恕?/p>

如常見的SQL語句:

String query = """
  SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
  WHERE `CITY` = 'INDIANAPOLIS'
  ORDER BY `EMP_ID`, `LAST_NAME`;
""";

看起來就比較直觀,清爽了。

總結(jié)

以上,就是JDK13中包含的5個(gè)特性,能夠改變開發(fā)者的編碼風(fēng)格的主要有Text Blocks和Switch Expressions兩個(gè)新特性,但是這兩個(gè)特性還處于預(yù)覽階段。

而且,JDK13并不是LTS(長期支持)版本,如果你正在使用Java 8(LTS)或者Java 11(LTS),暫時(shí)可以不必升級到Java 13.

參考資料:

https://openjdk.java.net/projects/jdk/13/

https://metebalci.com/blog/what-is-new-in-java-13/

https://www.jianshu.com/p/890196bf529a

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java面試之動態(tài)規(guī)劃與組合數(shù)

    Java面試之動態(tài)規(guī)劃與組合數(shù)

    這篇文章主要介紹了Java面試之動態(tài)規(guī)劃與組合數(shù)的相關(guān)知識,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java 時(shí)間轉(zhuǎn)換的實(shí)例代碼

    Java 時(shí)間轉(zhuǎn)換的實(shí)例代碼

    下面小編就為大家?guī)硪黄狫ava 時(shí)間轉(zhuǎn)換的實(shí)例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-07-07
  • 解析Spring Boot 如何讓你的 bean 在其他 bean 之前完成加載

    解析Spring Boot 如何讓你的 bean 在其他 bean&n

    在 SpringBoot 中如何讓自己的某個(gè)指定的 Bean 在其他 Bean 前完成被 Spring 加載?我聽到這個(gè)問題的第一反應(yīng)是,為什么會有這樣奇怪的需求?下面小編給大家分析下Spring Boot 如何讓你的 bean 在其他 bean 之前完成加載 ,感興趣的朋友一起看看吧
    2024-01-01
  • 通過jxl.jar 讀取、導(dǎo)出excel的實(shí)例代碼

    通過jxl.jar 讀取、導(dǎo)出excel的實(shí)例代碼

    通過jxl.jar 讀取、導(dǎo)出excel的實(shí)例代碼,需要的朋友可以參考一下
    2013-03-03
  • java動態(tài)代理詳解

    java動態(tài)代理詳解

    本文章要用很土的語言描述Java動態(tài)代理,力求更易被理解。Java是JDK5中新加的機(jī)制,大家都知道Spring是用Java的動態(tài)代理實(shí)現(xiàn)的,那這個(gè)動態(tài)代理是什么東東呢,首先他肯定是個(gè)代理,我們先講代理,把代理弄明白了,動態(tài)代理就好說了
    2014-02-02
  • Java中的轉(zhuǎn)換流InputStreamReader解讀

    Java中的轉(zhuǎn)換流InputStreamReader解讀

    InputStreamReader是Java.io包中的一個(gè)類,用于將字節(jié)輸入流轉(zhuǎn)換為字符輸入流,它繼承自java.io.Reader類,提供了兩種構(gòu)造方法,可以使用默認(rèn)或指定字符集創(chuàng)建實(shí)例,常用方法包括讀取字符、判斷是否準(zhǔn)備好讀取數(shù)據(jù)和關(guān)閉流
    2024-09-09
  • java中的內(nèi)存溢出方式

    java中的內(nèi)存溢出方式

    文章介紹了如何使用jmap和IBMHeapAnalyzer等工具分析OutOfMemoryError: Compressedclassspace錯誤,發(fā)現(xiàn)問題出在/org/pf4j/PluginClassLoader加載了大量類
    2024-12-12
  • mybatis中嵌套查詢的使用解讀

    mybatis中嵌套查詢的使用解讀

    這篇文章主要介紹了mybatis中嵌套查詢的使用解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java文件、文件夾權(quán)限修改的兩種方法

    Java文件、文件夾權(quán)限修改的兩種方法

    這篇文章主要給大家介紹了關(guān)于Java文件、文件夾權(quán)限修改的兩種方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • HTTP 415錯誤-Unsupported media type詳解

    HTTP 415錯誤-Unsupported media type詳解

    這篇文章主要介紹了HTTP 415錯誤-Unsupported media type詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評論

衡南县| 永康市| 江都市| 凤台县| 保德县| 安溪县| 民勤县| 砚山县| 青浦区| 林甸县| 黄山市| 桐乡市| 乌兰浩特市| 阿克| 都安| 洪洞县| 左云县| 汶川县| 宣城市| 正阳县| 申扎县| 盘锦市| 远安县| 华亭县| 墨江| 锦州市| 修武县| 丰台区| 眉山市| 漾濞| 稷山县| 房产| 多伦县| 伊宁市| 广水市| 克什克腾旗| 屏山县| 樟树市| 卓资县| 喜德县| 安图县|