JDK13到今天已經發布快2個月了,以前有零零散散的試過一些新的特性,但卻沒有總體的整理一下。想到做爲Java開發,連使用的JDK(Java Developerment Kit)有什麼特性都不清楚,實在是有些不該該,想要進階爲更有價值的JAVA開發人員,必定要跟得上JDK的最新特性。html
那再來看下,這份遲來的JDK新特性一覽java
全部的JDK特性都會在JEP進度中提出來和跟蹤:openjdk.java.net/jeps/0bash
對於每一個JDK版本的有什麼特性在對應JDK主頁中查看:openjdk.java.net/projects/jd…數據結構
JDK13主要有5個特性:app
在JDK10中被引入的新特性,可是當時建立步驟比較繁瑣。socket
# JDK10中須要的步驟
1. 須要指定要歸檔那些類 -XX:DumpLoadedClassList=classes.lst
2. 建立歸檔 -Xshare:dump -XX:SharedArchiveFile -XX:SharedClassListFile=classes.lst
3. 使用歸檔 -Xshare:on -XX:SharedArchiveFile
複製代碼
在JDK13中引入新的選項,在程序退出時自動歸檔:性能
java -XX:ArchiveClassesAtExit=app.jsa -cp app.jar HelloDemo
複製代碼
使用歸檔步驟與以前相同,默認-Xshare:on是開啓的ui
類加載過程:spa
加載->驗證->準備->解析->初始化->使用->卸載操作系統
CDS的設計目的主要爲了提高啓動應用時的速度,class-data只須要建立一次,後續重複使用,減小了加載,驗證,準備階段。可能會有解析階段
參考:App CDS實戰
ZGC從JDK11中被引入進來,在進行GC的時候保證更短的停頓時間,10ms如下,在JDK13中新增了歸還未提交,未使用的內存給操做系統
ZGC由許多的ZPage組成,Zpage是不一樣大小的內存區域,分爲小、中、大。當ZGC壓縮內存時,Zpage被清空到ZPageCache中,ZpageCache是準備隨時被用到的區域,若是被使用,會馬上從ZpageCache中移除到Zpage中,可是若是ZpageCache中的Zpage長時間未使用,則變爲未提交使用的內存,後續可還給操做系統。
When ZGC compacts the heap, ZPages are freed up and inserted into a page cache, the ZPageCache.
#設置一個時間多久從ZpageCache中移除(evict)Zpage
-XX:+UnlockExperimentalVMOptions -XX:+ZUncommit -XX:ZUncommitDelay=<seconds>
複製代碼
參考:ZGC徹底指南
JDK底層對Socket的實現很是的古老,從JDK1.0中被使用一直到如今,底層爲很早的Java和C代碼,對於開發JDK的人來講,很是的難以維護和Debug,所以從新實現了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();
}
}
}
複製代碼
可是咱們仍然能夠切換爲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
複製代碼
引入了一個新的關鍵字yield用於返回switch語句的內容。最開始咱們寫switch語句都要在語句以前作一些初始化變量,如今能夠直接獲得swicth語句額返回結果
最開始的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;
複製代碼
最開始寫長字符串的時候,每每要使用多個字符串拼接,一是浪費性能,而是看起來很難看。尤爲寫HTML字符串或者SQL語句時。
// 好比HTML
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
複製代碼
如今能夠寫成:
String html = """ <html> <body> <p>Hello, world</p> </body> </html> """;
複製代碼
注意:
""" 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在必定程度上仍是能夠加快咱們的開發速度...,最重要的是其歸檔特性能夠大大減小咱們應用的啓動時間,ZGC則讓咱們在內存吃緊時,又帶來了福音。
值得一試!