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個特性:
- 350: Dynamic CDS Archives 參考: http://www.reibang.com/p/0b8a9d137ee7
- 351: ZGC: Uncommit Unused Memory 參考:http://www.reibang.com/p/18fc5a042ed1
- 353: Reimplement the Legacy Socket API
- 354: Switch Expressions (Preview)
- 355: Text Blocks (Preview)
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)備階段。可能會有解析階段
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
/Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home/bin/java -XX:+TraceClassLoading -Djdk.net.usePlainSocketImpl me/aihe/HelloApp.java | grep -i socketI
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)存吃緊時顽耳,又帶來了福音。
值得一試筏养!