---
title: Java 9 æ°ç¹æ§æ¦è§
description: è§£æ Java 9 çæ¨¡ååç³»ç»ä¸ jlink çæ´æ°ï¼ç解对è¿è¡æ¶éåä¸åºä½¿ç¨çå½±åã
category: Java
tag:
- Javaæ°ç¹æ§
head:
- - meta
- name: keywords
content: Java 9,JDK9,模åå,JPMS,jlink,éå工忹æ³,æ° API
---
**Java 9** åå¸äº 2017 å¹´ 9 æ 21 æ¥ãä½ä¸º Java 8 ä¹å 3 å¹´åæåå¸çæ°çæ¬ï¼Java 9 带æ¥äºå¾å¤é大çååå
¶ä¸æéè¦çæ¹å¨æ¯ Java 平尿¨¡åç³»ç»çå¼å
¥ï¼å
¶ä»è¿æè¯¸å¦éåã`Stream` æµâ¦â¦
JDK 9 䏿¯ LTSï¼é¿ææ¯æçï¼ï¼è³æ¤ä¸ºæ¢ï¼ç®åæ JDK8ãJDK11ãJDK17ãJDK21 è¿åä¸ªé¿ææ¯æçäºã
è¿ç¯æç« 伿éå
¶ä¸è¾ä¸ºéè¦çä¸äºæ°ç¹æ§è¿è¡è¯¦ç»ä»ç»ï¼
- [JEP 222: Java Shell Tool (JShell)](https://openjdk.org/jeps/222)
- [JEP 261: Module System (模ååç³»ç»)](https://openjdk.org/jeps/261)
- [JEP 248: G1 Becomes the Default Garbage Collector (G1 æä¸ºé»è®¤åå¾åæ¶å¨)](https://openjdk.org/jeps/248)
- [JEP 254: Compact Strings (ç´§åå符串)](https://openjdk.org/jeps/254)
- [JEP 193: Variable Handles (åé奿)](https://openjdk.org/jeps/193)
ä¸å¾æ¯ä» JDK 8 å° JDK 25 æ¯ä¸ªçæ¬çæ´æ°å¸¦æ¥çæ°ç¹æ§æ°éåæ´æ°æ¶é´ï¼

## JEP 222: Java Shell Tool (JShell)
JShell æ¯ Java 9 æ°å¢çä¸ä¸ªå®ç¨å·¥å
·ã为 Java æä¾äºç±»ä¼¼äº Python ç宿¶å½ä»¤è¡äº¤äºå·¥å
·ã
å¨ JShell ä¸å¯ä»¥ç´æ¥è¾å
¥è¡¨è¾¾å¼å¹¶æ¥çå
¶æ§è¡ç»æã

**JShell 为æä»¬å¸¦æ¥äºåªäºå¥½å¤å¢ï¼**
1. éä½äºè¾åºç¬¬ä¸è¡ Java ç"Hello Worldï¼"ç鍿§ï¼è½å¤æé«æ°æçå¦ä¹ çæ
ã
2. å¨å¤çç®åçå°é»è¾ï¼éªè¯ç®åçå°é®é¢æ¶ï¼æ¯ IDE æ´ææçï¼å¹¶ä¸æ¯ä¸ºäºå代 IDEï¼å¯¹äºå¤æé»è¾çéªè¯ï¼IDE æ´åéï¼ä¸¤è
äºè¡¥ï¼ã
3. â¦â¦
**JShell ç代ç åæ®éçå¯ç¼è¯ä»£ç ï¼æä»ä¹ä¸ä¸æ ·ï¼**
1. 䏿¦è¯å¥è¾å
¥å®æï¼JShell ç«å³å°±è½è¿åæ§è¡çç»æï¼èä¸åéè¦ç¼è¾å¨ãç¼è¯å¨ãè§£éå¨ã
2. JShell æ¯æåéçéå¤å£°æï¼åé¢å£°æçä¼è¦çåé¢å£°æçã
3. JShell æ¯æç¬ç«çè¡¨è¾¾å¼æ¯å¦æ®éçå æ³è¿ç® `1 + 1`ã
4. â¦â¦
## JEP 261: Module System (模ååç³»ç»)
模åç³»ç»æ¯[Jigsaw Project](https://openjdk.java.net/projects/jigsaw/)çä¸é¨åï¼ææ¨¡ååå¼åå®è·µå¼å
¥å°äº Java å¹³å°ä¸ï¼å¯ä»¥è®©æä»¬ç代ç å¯éç¨æ§æ´å¥½ï¼
**ä»ä¹æ¯æ¨¡åç³»ç»ï¼** 宿¹çå®ä¹æ¯ï¼
> A uniquely named, reusable group of related packages, as well as resources (such as images and XML files) and a module descriptorã
ç®åæ¥è¯´ï¼ä½ å¯ä»¥å°ä¸ä¸ªæ¨¡åç使¯ä¸ç»å¯ä¸å½åãå¯éç¨çå
ãèµæºå模åæè¿°æä»¶ï¼`module-info.java`ï¼ã
ä»»æä¸ä¸ª jar æä»¶ï¼åªè¦å ä¸ä¸ä¸ªæ¨¡åæè¿°æä»¶ï¼`module-info.java`ï¼ï¼å°±å¯ä»¥å级为ä¸ä¸ªæ¨¡åã

å¨å¼å
¥äºæ¨¡åç³»ç»ä¹åï¼JDK è¢«éæ°ç»ç»æ 94 个模åãJava åºç¨å¯ä»¥éè¿æ°å¢ç **[jlink](http://openjdk.java.net/jeps/282) å·¥å
·** (Jlink æ¯é Java 9 ä¸èµ·åå¸çæ°å½ä»¤è¡å·¥å
·ãå®å
许å¼å人å为åºäºæ¨¡åç Java åºç¨ç¨åºå建èªå·±çè½»é级ãå®å¶ç JRE)ï¼å建åºåªå
嫿ä¾èµç JDK 模åçèªå®ä¹è¿è¡æ¶éåãè¿æ ·å¯ä»¥æå¤§çåå° Java è¿è¡æ¶ç¯å¢ç大å°ã
æä»¬å¯ä»¥éè¿ `exports` å
³é®åç²¾åæ§å¶åªäºç±»å¯ä»¥å¯¹å¤å¼æ¾ä½¿ç¨ï¼åªäºç±»åªè½å
é¨ä½¿ç¨ã
```java
module my.module {
//exports å
¬å¼æå®å
çææå
Œ
±æå
exports com.my.package.name;
}
module my.module {
//exportsâ¦to éå¶è®¿é®çæåèå´
exports com.my.package.name to com.specific.package;
}
```
æ³è¦æ·±å
¥äºè§£ Java 9 çæ¨¡ååï¼å¯ä»¥åèä¸é¢è¿å ç¯æç« ï¼
- [ãProject Jigsaw: Module System Quick-Start Guideã](https://openjdk.java.net/projects/jigsaw/quick-start)
- [ãJava 9 Modules: part 1ã](https://stacktraceguru.com/java9/module-introduction)
- [Java 9 æç§ï¼2. 模ååç³»ç»ï¼](http://www.cnblogs.com/IcanFixIt/p/6947763.html)
## JEP 248: G1 Becomes the Default Garbage Collector (G1 æä¸ºé»è®¤åå¾åæ¶å¨)
å¨ Java 8 çæ¶åï¼é»è®¤åå¾åæ¶å¨æ¯ Parallel Scavengeï¼æ°ç代ï¼+Parallel Oldï¼è年代ï¼ãå°äº Java 9, CMS åå¾åæ¶å¨è¢«åºå¼äºï¼**G1ï¼Garbage-First Garbage Collectorï¼** æä¸ºäºé»è®¤åå¾åæ¶å¨ã
G1 è¿æ¯å¨ Java 7 ä¸è¢«å¼å
¥çï¼ç»è¿ä¸¤ä¸ªçæ¬ä¼å¼çè¡¨ç°æä¸ºé»è®¤åå¾åæ¶å¨ã
## JEP 193: Variable Handles (åé奿)
åé奿æ¯ä¸ä¸ªåéæä¸ç»åéçå¼ç¨ï¼å
æ¬éæåï¼ééæåï¼æ°ç»å
ç´ åå 夿°æ®ç»æä¸çç»æé¨åçã
åé奿çå«ä¹ç±»ä¼¼äºå·²æçæ¹æ³å¥æ `MethodHandle` ï¼ç± Java ç±» `java.lang.invoke.VarHandle` æ¥è¡¨ç¤ºï¼å¯ä»¥ä½¿ç¨ç±» `java.lang.invoke.MethodHandles.Lookup` ä¸çéæå·¥åæ¹æ³æ¥å建 `VarHandle` 对象ã
`VarHandle` çåºç°æ¿ä»£äº `java.util.concurrent.atomic` å `sun.misc.Unsafe` çé¨åæä½ã并䏿ä¾äºä¸ç³»åæ åçå
åå±éæä½ï¼ç¨äºæ´å ç»ç²åº¦çæ§å¶å
åæåºãå¨å®å
¨æ§ãå¯ç¨æ§ãæ§è½ä¸é½è¦ä¼äºç°æç APIã
## API å¢å¼º
并䏿¯ææç API æ¹å¨é½ä¼éè¿ JEPï¼Java Enhancement Proposalï¼æ¥åå¸ã
å¨ JDK çå¼åæµç¨ä¸ï¼**JEP** é常ç¨äºéå¤§çæ¹åï¼ä¾å¦å¼å
¥æ°çè¯è¨ç¹æ§ãæ°ç JVM æºå¶æè
å¤§è§æ¨¡çåºéæãå `List.of()` è¿ç§å¨ç°æç±»ä¸å¢å å ä¸ªå·¥åæ¹æ³çæä½ï¼é常被è§ä¸ºå¸¸è§çåºç»´æ¤ãå®ä»¬ç± JDK å¼åè
ç´æ¥éè¿ **JBS (JDK Bug System)** çå·¥åï¼Ticketï¼è¿è¡æäº¤åè¯å®¡ï¼ç¶åéçæ¬ç´æ¥åå¸ã
### éåå¢å¼º
å¢å äº`List.of()`ã`Set.of()`ã`Map.of()` å `Map.ofEntries()`çå·¥åæ¹æ³æ¥å建ä¸å¯åéåï¼æç¹åè Guava çå³éï¼ï¼
```java
List.of("Java", "C++");
Set.of("Java", "C++");
Map.of("Java", 1, "C++", 2);
```
ä½¿ç¨ `of()` å建çéå为ä¸å¯åéåï¼ä¸è½è¿è¡æ·»å ãå é¤ãæ¿æ¢ã æåºçæä½ï¼ä¸ç¶ä¼æ¥ `java.lang.UnsupportedOperationException` å¼å¸¸ã
### Stream å¢å¼º
`Stream` ä¸å¢å äºæ°çæ¹æ³ `ofNullable()`ã`dropWhile()`ã`takeWhile()` 以å `iterate()` æ¹æ³çéè½½æ¹æ³ã
Java 9 ä¸ç `ofNullable()` æ¹ æ³å
许æä»¬å建ä¸ä¸ªåå
ç´ ç `Stream`ï¼å¯ä»¥å
å«ä¸ä¸ªé空å
ç´ ï¼ä¹å¯ä»¥å建ä¸ä¸ªç©º `Stream` ã èå¨ Java 8 ä¸åä¸å¯ä»¥å建空ç `Stream` ã
```java
Stream