JDK13新特性,讓開發效率更快一步

JDK13到今天已經發布快2個月了,以前有零零散散的試過一些新的特性,但卻沒有總體的整理一下。想到做爲Java開發,連使用的JDK(Java Developerment Kit)有什麼特性都不清楚,實在是有些不該該,想要進階爲更有價值的JAVA開發人員,必定要跟得上JDK的最新特性。html

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

JDK13

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

對於每一個JDK版本的有什麼特性在對應JDK主頁中查看:openjdk.java.net/projects/jd…數據結構

JDK13主要有5個特性:app

Dynamic CDS Archives

在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

加載->驗證->準備->解析->初始化->使用->卸載操作系統

  • 加載:找到Class的位置,從Class位置讀取Class文件內容
  • 驗證:文件格式的驗證、元數據的驗證、字節碼驗證和符號引用驗證。
  • 準備:正式爲類變量分配內存並設置類變量初始值的階段,這些內存都將在方法區中分配。存儲爲JDK內部數據結構
  • 解析:虛擬機將常量池中的符號引用轉化爲直接引用的過程,解析接口,字段解析
  • 初始化:建立類

CDS的設計目的主要爲了提高啓動應用時的速度,class-data只須要建立一次,後續重複使用,減小了加載,驗證,準備階段。可能會有解析階段

參考:App CDS實戰

ZGC: Uncommit Unused Memory

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徹底指南

Reimplement the Legacy Socket API

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
複製代碼

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)

引入了一個新的關鍵字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;
複製代碼

Text Blocks (Preview)

最開始寫長字符串的時候,每每要使用多個字符串拼接,一是浪費性能,而是看起來很難看。尤爲寫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則讓咱們在內存吃緊時,又帶來了福音。

值得一試!

相關文章
相關標籤/搜索