---
title: Java 19 æ°ç¹æ§æ¦è§
category: Java
tag:
- Javaæ°ç¹æ§
---
JDK 19 å®äº 2022 å¹´ 9 æ 20 æ¥æ£å¼åå¸ä»¥ä¾ç产使ç¨ï¼éé¿ææ¯æçæ¬ãä¸è¿ï¼JDK 19 䏿ä¸äºæ¯è¾éè¦çæ°ç¹æ§å¼å¾å
³æ³¨ã
JDK 19 åªæ 7 个æ°ç¹æ§ï¼
- [JEP 405: Record Patternsï¼è®°å½æ¨¡å¼ï¼](https://openjdk.org/jeps/405)ï¼é¢è§ï¼
- [JEP 422: Linux/RISC-V Port](https://openjdk.org/jeps/422)
- [JEP 424: Foreign Function & Memory APIï¼å¤é¨å½æ°åå
å APIï¼](https://openjdk.org/jeps/424)ï¼é¢è§ï¼
- [JEP 425: Virtual Threadsï¼èæçº¿ç¨ï¼](https://openjdk.org/jeps/425)ï¼é¢è§ï¼
- [JEP 426: Vectorï¼åéï¼API](https://openjdk.java.net/jeps/426)ï¼ç¬¬å次åµåï¼
- [JEP 427: Pattern Matching for switchï¼switch 模å¼å¹é
ï¼](https://openjdk.java.net/jeps/427)
- [JEP 428: Structured Concurrencyï¼ç»æåå¹¶åï¼](https://openjdk.org/jeps/428)ï¼åµåï¼
è¿éåªå¯¹ 424ã425ã426ã428 è¿ 4 个æè§å¾æ¯è¾éè¦çæ°ç¹æ§è¿è¡è¯¦ç»ä»ç»ã
ç¸å
³é
读ï¼[OpenJDK Java 19 ææ¡£](https://openjdk.org/projects/jdk/19/)
## JEP 424: å¤é¨å½æ°åå
å APIï¼é¢è§ï¼
Java ç¨åºå¯ä»¥éè¿è¯¥ API ä¸ Java è¿è¡æ¶ä¹å¤ç代ç åæ°æ®è¿è¡äºæä½ãéè¿é«æå°è°ç¨å¤é¨å½æ°ï¼å³ JVM ä¹å¤ç代ç ï¼åå®å
¨å°è®¿é®å¤é¨å
åï¼å³ä¸å JVM 管ççå
åï¼ï¼è¯¥ API 使 Java ç¨åºè½å¤è°ç¨æ¬æºåºå¹¶å¤çæ¬æºæ°æ®ï¼èä¸ä¼å JNI 飿 ·å±é©åèå¼±ã
å¤é¨å½æ°åå
å API å¨ Java 17 ä¸è¿è¡äºç¬¬ä¸è½®åµåï¼ç± [JEP 412](https://openjdk.java.net/jeps/412) æåºã第äºè½®åµåç±[JEP 419](https://openjdk.org/jeps/419) æåºå¹¶éæå°äº Java 18 ä¸ï¼é¢è§ç± [JEP 424](https://openjdk.org/jeps/424) æåºå¹¶éæå°äº Java 19 ä¸ã
卿²¡æå¤é¨å½æ°åå
å API ä¹åï¼
- Java éè¿ [`sun.misc.Unsafe`](https://hg.openjdk.java.net/jdk/jdk/file/tip/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java) æä¾ä¸äºæ§è¡ä½çº§å«ãä¸å®å
¨æä½çæ¹æ³ï¼å¦ç´æ¥è®¿é®ç³»ç»å
åèµæºãèªä¸»ç®¡çå
åèµæºçï¼ï¼`Unsafe` 类让 Java è¯è¨æ¥æäºç±»ä¼¼ C è¯è¨æé䏿 ·æä½å
å空é´çè½åçåæ¶ï¼ä¹å¢å äº Java è¯è¨çä¸å®å
¨æ§ï¼ä¸æ£ç¡®ä½¿ç¨ `Unsafe` ç±»ä¼ä½¿å¾ç¨åºåºéçæ¦çå大ã
- Java 1.1 就已éè¿ Java åçæ¥å£ï¼JNIï¼æ¯æäºåçæ¹æ³è°ç¨ï¼ä½å¹¶ä¸å¥½ç¨ãJNI å®ç°èµ·æ¥è¿äºå¤æï¼æ¥éª¤ç¹çï¼å
·ä½çæ¥éª¤å¯ä»¥åèè¿ç¯æç« ï¼[Guide to JNI (Java Native Interface)](https://www.baeldung.com/jni) ï¼ï¼ä¸å JVM çè¯è¨å®å
¨æºå¶æ§å¶ï¼å½±å Java è¯è¨ç跨平å°ç¹æ§ãå¹¶ä¸ï¼JNI çæ§è½ä¹ä¸è¡ï¼å 为 JNI æ¹æ³è°ç¨ä¸è½ä»è®¸å¤å¸¸è§ç JIT ä¼å(å¦å
è)ä¸åçãè½ç¶[JNA](https://github.com/java-native-access/jna)ã[JNR](https://github.com/jnr/jnr-ffi)å[JavaCPP](https://github.com/bytedeco/javacpp)çæ¡æ¶å¯¹ JNI è¿è¡äºæ¹è¿ï¼ä½ææè¿æ¯ä¸å¤ªçæ³ã
å¼å
¥å¤é¨å½æ°åå
å API å°±æ¯ä¸ºäºè§£å³ Java 访é®å¤é¨å½æ°åå¤é¨å
ååå¨çä¸äºçç¹ã
Foreign Function & Memory API (FFM API) å®ä¹äºç±»åæ¥å£ï¼
- åé
å¤é¨å
åï¼`MemorySegment`ãã`MemoryAddress`å`SegmentAllocator`ï¼ï¼
- æä½å访é®ç»æåçå¤é¨å
åï¼`MemoryLayout`, `VarHandle`ï¼
- æ§å¶å¤é¨å
åçåé
åéæ¾ï¼`MemorySession`ï¼
- è°ç¨å¤é¨å½æ°ï¼`Linker`ã`FunctionDescriptor`å`SymbolLookup`ã
ä¸é¢æ¯ FFM API 使ç¨ç¤ºä¾ï¼è¿æ®µä»£ç è·åäº C åºå½æ°ç `radixsort` æ¹æ³å¥æï¼ç¶å使ç¨å®å¯¹ Java æ°ç»ä¸çå个å符串è¿è¡æåºã
```java
// 1. å¨Cåºè·¯å¾ä¸æ¥æ¾å¤é¨å½æ°
Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();
MethodHandle radixSort = linker.downcallHandle(
stdlib.lookup("radixsort"), ...);
// 2. åé
å ä¸å
å以åå¨å个å符串
String[] javaStrings = { "mouse", "cat", "dog", "car" };
// 3. åé
å å¤å
å以åå¨å个æé
SegmentAllocator allocator = implicitAllocator();
MemorySegment offHeap = allocator.allocateArray(ValueLayout.ADDRESS, javaStrings.length);
// 4. å°å符串ä»å ä¸å¤å¶å°å å¤
for (int i = 0; i < javaStrings.length; i++) {
// å¨å å¤åé
ä¸ä¸ªå符串ï¼ç¶åå卿åå®çæé
MemorySegment cString = allocator.allocateUtf8String(javaStrings[i]);
offHeap.setAtIndex(ValueLayout.ADDRESS, i, cString);
}
// 5. éè¿è°ç¨å¤é¨å½æ°å¯¹å 夿°æ®è¿è¡æåº
radixSort.invoke(offHeap, javaStrings.length, MemoryAddress.NULL, '\0');
// 6. å°(éæ°æåºç)å符串ä»å å¤å¤å¶å°å ä¸
for (int i = 0; i < javaStrings.length; i++) {
MemoryAddress cStringPtr = offHeap.getAtIndex(ValueLayout.ADDRESS, i);
javaStrings[i] = cStringPtr.getUtf8String(0);
}
assert Arrays.equals(javaStrings, new String[] {"car", "cat", "dog", "mouse"}); // true
```
## JEP 425: èæçº¿ç¨ï¼é¢è§ï¼
èæçº¿ç¨ï¼Virtual Thread-ï¼æ¯ JDK è䏿¯ OS å®ç°çè½»é级线ç¨(Lightweight Processï¼LWPï¼ï¼è®¸å¤èæçº¿ç¨å
±äº«åä¸ä¸ªæä½ç³»ç»çº¿ç¨ï¼èæçº¿ç¨çæ°éå¯ä»¥è¿å¤§äºæä½ç³»ç»çº¿ç¨çæ°éã
èæçº¿ç¨å¨å
¶ä»å¤çº¿ç¨è¯è¨ä¸å·²ç»è¢«è¯å®æ¯ååæç¨çï¼æ¯å¦ Go ä¸ç GoroutineãErlang ä¸çè¿ç¨ã
èæçº¿ç¨é¿å
äºä¸ä¸æåæ¢çé¢å¤èè´¹ï¼å
¼é¡¾äºå¤çº¿ç¨çä¼ç¹ï¼ç®åäºé«å¹¶åç¨åºç夿ï¼å¯ä»¥ææåå°ç¼åãç»´æ¤åè§å¯é«ååéå¹¶ååºç¨ç¨åºçå·¥ä½éã
ç¥ä¹æä¸ä¸ªå
³äº Java 19 èæçº¿ç¨çè®¨è®ºï¼æå
´è¶£çå¯ä»¥å»ççï¼