JDK13新特性济似,讓開發(fā)效率更快一步

JDK13到今天已經(jīng)發(fā)布快2個月了,之前有零零散散的試過一些新的特性赂蠢,但卻沒有整體的整理一下绪穆。想到作為Java開發(fā),連使用的JDK(Java Developerment Kit)有什么特性都不清楚虱岂,實在是有些不應(yīng)該玖院,想要進階為更有價值的JAVA開發(fā)人員,一定要跟得上JDK的最新特性第岖。

那再來看下难菌,這份遲來的JDK新特性一覽

JDK13

所有的JDK特性都會在JEP進度中提出來和跟蹤:https://openjdk.java.net/jeps/0

對于每個JDK版本的有什么特性在對應(yīng)JDK主頁中查看:https://openjdk.java.net/projects/jdk/13/

JDK13主要有5個特性:

Dynamic CDS Archives

在JDK10中被引入的新特性,但是當(dāng)時創(chuàng)建步驟比較繁瑣绍傲。

# JDK10中需要的步驟
1. 需要指定要歸檔那些類  -XX:DumpLoadedClassList=classes.lst
2. 創(chuàng)建歸檔   -Xshare:dump  -XX:SharedArchiveFile -XX:SharedClassListFile=classes.lst
3. 使用歸檔  -Xshare:on -XX:SharedArchiveFile

在JDK13中引入新的選項扔傅,在程序退出時自動歸檔:

java -XX:ArchiveClassesAtExit=app.jsa -cp app.jar HelloDemo

使用歸檔步驟與之前相同耍共,默認(rèn)-Xshare:on是開啟的

類加載過程:

加載->驗證->準(zhǔn)備->解析->初始化->使用->卸載

  • 加載:找到Class的位置烫饼,從Class位置讀取Class文件內(nèi)容
  • 驗證:文件格式的驗證、元數(shù)據(jù)的驗證试读、字節(jié)碼驗證和符號引用驗證杠纵。
  • 準(zhǔn)備:正式為類變量分配內(nèi)存并設(shè)置類變量初始值的階段,這些內(nèi)存都將在方法區(qū)中分配钩骇。存儲為JDK內(nèi)部數(shù)據(jù)結(jié)構(gòu)
  • 解析:虛擬機將常量池中的符號引用轉(zhuǎn)化為直接引用的過程比藻,解析接口,字段解析
  • 初始化:創(chuàng)建類

CDS的設(shè)計目的主要為了提升啟動應(yīng)用時的速度倘屹,class-data只需要創(chuàng)建一次银亲,后續(xù)重復(fù)使用,減少了加載纽匙,驗證务蝠,準(zhǔn)備階段。可能會有解析階段

參考:App CDS實戰(zhàn)

ZGC: Uncommit Unused Memory

ZGC從JDK11中被引入進來烛缔,在進行GC的時候保證更短的停頓時間馏段,10ms以下,在JDK13中新增了歸還未提交践瓷,未使用的內(nèi)存給操作系統(tǒng)

ZGC由許多的ZPage組成院喜,Zpage是不同大小的內(nèi)存區(qū)域,分為小晕翠、中喷舀、大。當(dāng)ZGC壓縮內(nèi)存時,Zpage被清空到ZPageCache中元咙,ZpageCache是準(zhǔn)備隨時被用到的區(qū)域梯影,如果被使用,會立刻從ZpageCache中移除到Zpage中庶香,但是如果ZpageCache中的Zpage長時間未使用甲棍,則變?yōu)槲刺峤皇褂玫膬?nèi)存,后續(xù)可還給操作系統(tǒng)赶掖。

When ZGC compacts the heap, ZPages are freed up and inserted into a page cache, the ZPageCache.

#設(shè)置一個時間多久從ZpageCache中移除(evict)Zpage
-XX:+UnlockExperimentalVMOptions -XX:+ZUncommit  -XX:ZUncommitDelay=<seconds> 

參考:ZGC完全指南

Reimplement the Legacy Socket API

JDK底層對Socket的實現(xiàn)非常的古老感猛,從JDK1.0中被使用一直到現(xiàn)在,底層為很早的Java和C代碼奢赂,對于開發(fā)JDK的人來說陪白,非常的難以維護和Debug,因此重新實現(xiàn)了Socket API的接口膳灶。

  • JDK13之前咱士,使用PlainSocketImpl

  • JDK13引入了,NioSocketImpl替換PlainSocketImpl轧钓。

來一個HelloWorld案例:

public class HelloApp {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8888)) {

            boolean running = true;
            System.out.println("listened 8888");
            while (running) {
                Socket clientSocket = serverSocket.accept();

                //do something with clientSocket
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

但是我們?nèi)匀豢梢郧袚Q為PlainSocketImpl序厉。需配置jdk.net.usePlainSocketImpl

/Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home/bin/java -XX:+TraceClassLoading  me/aihe/HelloApp.java | grep -i socketI
image-20191108074323662
/Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home/bin/java -XX:+TraceClassLoading -Djdk.net.usePlainSocketImpl  me/aihe/HelloApp.java | grep -i socketI
image-20191108074413822

Switch Expressions (Preview)

引入了一個新的關(guān)鍵字yield用于返回switch語句的內(nèi)容。最開始我們寫switch語句都要在語句之前做一些初始化變量毕箍,現(xiàn)在可以直接得到swicth語句額返回結(jié)果

最開始的switch寫法:

int numLetters;
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        numLetters = 6;
        break;
    case TUESDAY:
        numLetters = 7;
        break;
    case THURSDAY:
    case SATURDAY:
        numLetters = 8;
        break;
    case WEDNESDAY:
        numLetters = 9;
        break;
    default:
        throw new IllegalStateException("Wat: " + day);
}

在JDK13中可以這樣寫:

# 沒有邏輯的返回
int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};

# 邏輯較多的處理
      String result = switch (number) {
            case 1, 2:
                    // 邏輯代碼
                yield "one or two";
            case 3:
                  // 邏輯代碼
                yield "three";
            case 4, 5, 6:
                yield "four or five or six";
            default:
                yield "unknown";
        };
        return result;

Text Blocks (Preview)

最開始寫長字符串的時候弛房,往往要使用多個字符串拼接,一是浪費性能而柑,而是看起來很難看文捶。尤其寫HTML字符串或者SQL語句時。

// 比如HTML
String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, world</p>\n" +
              "    </body>\n" +
              "</html>\n";

現(xiàn)在可以寫成:

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

注意:

  • 其中有個細(xì)微的區(qū)別媒咳,是開頭"""之后必須另起一行粹排,另外結(jié)尾的"""是否另起一行有不同的效果
  • 注意在使用的時候每一行可能需要處理兩邊的空格
"""
line 1
line 2
line 3
"""

=>

"line 1\nline 2\nline 3\n"
"""
line 1
line 2
line 3"""

=>

"line 1\nline 2\nline 3"

最后

JDK13在一定程度上還是可以加快我們的開發(fā)速度...,最重要的是其歸檔特性可以大大減少我們應(yīng)用的啟動時間涩澡,ZGC則讓我們在內(nèi)存吃緊時顽耳,又帶來了福音。

值得一試筏养!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斧抱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子渐溶,更是在濱河造成了極大的恐慌辉浦,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茎辐,死亡現(xiàn)場離奇詭異宪郊,居然都是意外死亡掂恕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門弛槐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懊亡,“玉大人,你說我怎么就攤上這事乎串〉暝妫” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵叹誉,是天一觀的道長鸯两。 經(jīng)常有香客問我,道長长豁,這世上最難降的妖魔是什么钧唐? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮匠襟,結(jié)果婚禮上钝侠,老公的妹妹穿的比我還像新娘。我一直安慰自己酸舍,他們只是感情好帅韧,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著父腕,像睡著了一般弱匪。 火紅的嫁衣襯著肌膚如雪青瀑。 梳的紋絲不亂的頭發(fā)上璧亮,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音斥难,去河邊找鬼枝嘶。 笑死,一個胖子當(dāng)著我的面吹牛哑诊,可吹牛的內(nèi)容都是我干的群扶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼镀裤,長吁一口氣:“原來是場噩夢啊……” “哼竞阐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起暑劝,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤骆莹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后担猛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幕垦,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡丢氢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了先改。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疚察。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仇奶,靈堂內(nèi)的尸體忽然破棺而出貌嫡,到底是詐尸還是另有隱情,我是刑警寧澤该溯,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布衅枫,位于F島的核電站,受9級特大地震影響朗伶,放射性物質(zhì)發(fā)生泄漏弦撩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一论皆、第九天 我趴在偏房一處隱蔽的房頂上張望益楼。 院中可真熱鬧,春花似錦点晴、人聲如沸感凤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陪竿。三九已至,卻和暖如春屠橄,著一層夾襖步出監(jiān)牢的瞬間族跛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工锐墙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留礁哄,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓溪北,卻偏偏與公主長得像桐绒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子之拨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容