如果您熟悉英文强烈建议阅读官方文档 。
java新增方法 当然,下面只是部分:
String 1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Test public  void  testString ()  {    String  s  =  " Jimo " ;     Assert.assertEquals("Jimo" , s.strip());     Assert.assertEquals("Jimo " , s.stripLeading());     Assert.assertEquals(" Jimo" , s.stripTrailing());     Assert.assertFalse(s.isBlank());     Assert.assertEquals(" Jimo  Jimo  Jimo " , s.repeat(3 ));     var  lines  =  "I'm a super man\ndo you know me?\n" ;     final  Stream<String> stringStream = lines.lines();     System.out.println(stringStream.collect(Collectors.toList()));      } 
 
File 1 2 3 4 5 6 7 8 @Test public  void  testFile ()  throws  IOException {    final  Path  path  =  Path.of("test.txt" );     Files.writeString(path, "Ha jimo" );     Assert.assertEquals("Ha jimo" , Files.readString(path));     Assert.assertTrue(Files.isSameFile(path, path)); } 
 
Predicate 1 2 3 4 5 6 7 8 9 10 11 @Test public  void  testPredicate ()  {    final  long  count  =  Stream.of("a" , "b" , "" )             .filter(Predicate.not(String::isEmpty))             .count();     Assert.assertEquals(2 , count);     final  Predicate<String> predicate =             Pattern.compile("jimo." ).asMatchPredicate();     Assert.assertTrue(predicate.test("jimo1" )); } 
 
Thread 1 2 3 4 5 6 7 8 9 10 @Test public  void  testThread ()  {    final  Thread  t  =  new  Thread ();     t.stop(); } 
 
TimeUnit 1 2 3 4 5 6 @Test public  void  testTimeUnit ()  {    final  TimeUnit  unit  =  TimeUnit.DAYS;     Assert.assertEquals(2 , unit.convert(Duration.ofHours(49 )));     Assert.assertEquals(1 , unit.convert(Duration.ofMinutes(1450 ))); } 
 
lambda var lambda表达式中支持可变参数var,并且可以注解.
1 2 3 4 5 6 7 8 @Test public  void  testParam ()  {    final  long  count  =  Arrays             .stream(new  int []{1 , 2 , 3 , 4 })             .filter((@Nonnull  var  x) -> x > 2 )             .count();     System.out.println(count); } 
 
改进64位架构内部函数 改进现有的String和array内在函数,并在AArch64处理器上为java.lang.Math sin,cos和log函数实现新的内在函数。
原因:专用的CPU架构的代码模式可提高用户应用程序和基准测试的性能
下面分别在JDK8和JDK11上测试对比:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 @Test public  void  testMathOnJDK11 ()  {    final  long  startTime  =  System.nanoTime();     for  (int  i  =  0 ; i < 10000000 ; i++) {         Math.sin(i);         Math.cos(i);         Math.log(i);     }     final  long  endTime  =  System.nanoTime();     System.out.println(TimeUnit.NANOSECONDS.toMillis(endTime - startTime) + "ms" );      } @Test public  void  testMathOnJDK8 ()  {    final  long  startTime  =  System.nanoTime();     for  (int  i  =  0 ; i < 10000000 ; i++) {         Math.sin(i);         Math.cos(i);         Math.log(i);     }     final  long  endTime  =  System.nanoTime();     System.out.println(TimeUnit.NANOSECONDS.toMillis(endTime - startTime) + "ms" );      } 
 
移除Java EE和CORBA模块 JDK6包含完整的Web Service开发栈
名词解释 
JAX-WS(基于XML的Web服务Java API),JAXB(用于XML绑定的Java架构), JAF(JavaBeans Activation Framework)和Common Annotations
 
CORBA(Common Object Request Broker Architecture)通用对象请求代理架构是软件构建的一个标准
 
 
为什么移除? 
JavaSE集成JavaEE存在问题:相关性,版本 
Java EE的包可以很方便的从Maven等三方库获取 
并没多少人用JDK中的Java EE 
 
HTTP Client标准化 HTTP Client:JDK9提出,JDK10更新,JDK11标准化
从开始的孵化特性走向成熟,形成标准,有意思
JDK HTTP Client可用于通过网络请求HTTP资源;
它支持HTTP / 1.1和HTTP / 2 
包括同步和异步编程模型,还支持并发 
将请求和响应主体作为反应流处理 
遵循熟悉的Builder模式。 
 
1 2 3 4 5 6 7 8 9 10 11 @Test public  void  testGet ()  {    final  HttpClient  client  =  HttpClient.newHttpClient();     final  HttpRequest  request  =  HttpRequest.newBuilder()             .uri(URI.create("http://openjdk.java.net" ))             .build();     client.sendAsync(request, HttpResponse.BodyHandlers.ofString())             .thenApply(HttpResponse::body)             .thenAccept(System.out::println)             .join(); } 
 
java单文件运行 http://openjdk.java.net/jeps/330 
以前运行java文件  
 
现在  
但是如果有内部类则找不到:
 
Filght Recorder(JFR) http://openjdk.java.net/jeps/328 
干什么的 
提供用于生成和使用数据作为事件的API 
提供缓冲机制和二进制数据格式 
允许配置和过滤事件 
为OS,HotSpot JVM和JDK库提供事件 
 
为什么需要 故障排除,监视和分析是开发生命周期中不可或缺的部分,但是在涉及实际数据的繁重负载下,某些问题仅发生在生产中。
Flight Recorder记录来自应用程序,JVM和OS的事件。 事件存储在一个文件中,该文件可以附加到错误报告中并由支持工程师进行检查,允许事后分析导致问题时的问题。 工具可以使用API从记录文件中提取信息。
飞行记录嘛:飞机飞行时的记录,对于程序就是程序运行时的记录,包括状态监控和数据收集等
如何启动  
 
JFR-测试 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public  class  FlightRecorderTest  extends  Event  {    @Label("Hello World")      @Description("Helps the programmer getting started")      static  class  HelloWorld  extends  Event  {         @Label("Message")          String message;     }     public  static  void  main (String[] args)  {         HelloWorld  event  =  new  HelloWorld ();         event.message = "hello, world!" ;         event.commit();     } } 
 
运行时加上命令行参数:
 
读取记录 1 2 3 4 5 6 7 8 9 10 11 12 13 @Test public  void  readRecordFile ()  throws  IOException {    final  Path  path  =  Paths.get("E:\\ws\\Git\\java-version-compare\\myrecording.jfr" );     final  List<RecordedEvent> recordedEvents = RecordingFile.readAllEvents(path);     for  (RecordedEvent event : recordedEvents) {         System.out.println(event.getStartTime() + ","  + event.getValue("message" ));     } } 
 
 
https://docs.oracle.com/javacomponents/jmc-5-5/jfr-runtime-guide/run.htm#JFRRT164 
JDK11-低开销堆内存分析 提供一种从JVM获取有关Java对象堆分配的信息的方法:
低开销 
可通过定义明确的程序接口访问, 
可以对所有分配进行采样(即,不限于在一个特定堆区域中的分配或以一种特定方式分配的分配), 
可以以与实现无关的方式定义(即,不依赖于任何特定的GC算法或VM实现) 
以及可以提供有关实时和死Java对象的信息。 
 
why 现有的堆内存工具:Java Flight Recorder, jmap, YourKit, and VisualVM
现在获取Hotspot信息的方式:
https://github.com/google/allocation-instrumenter  
Java Flight Recorder:只能记录,不能定制采样间隔,不能区分死/活对象 
 
how 扩展了JVM TI:增加了分析接口
JVMTI(JVM Tool Interface): JDK1.5提出,一般是C,C++实现该接口,在JVM启动时加载
http://openjdk.java.net/jeps/331 
google开源内存分析工具:https://github.com/google/allocation-instrumenter 
JVMTI介绍:https://en.wikipedia.org/wiki/Java_Virtual_Machine_Tools_Interface 
Jvmti的使用:https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html 
JDK11-无操作(No-Op)GC 当堆内存枯竭时,JVM直接关闭,什么都不做 ,还有一个碉堡的名字:Epsilon 
why 不同的垃圾回收器做不同的事嘛,存在即合理
性能测试 
内存压力测试 
VM接口测试 
生存期极短Job测试 
延时高敏感程序测试 
吞吐量提高 
 
启动参数:XX:+UseEpsilonGC
http://openjdk.java.net/jeps/318 
JDK11-ZGC(实验性) Z垃圾回收器,也称为ZGC,是一个可扩展的低延迟(scalable low-latency)垃圾回收器. ZGC是一个并发的,单例的,基于区域的,NUMA感知的压缩回收器。 Stop-the-world阶段仅限于根扫描,因此GC暂停时间不会随堆或活动集的大小而增加
GC暂停时间不应超过10毫秒 
处理堆的大小从相对较小(几百MB)到非常大(TB)不等 
与使用G1相比,应用程序吞吐量减少不超过15% 
为未来的GC功能、优化利用彩色指针和负载屏障奠定基础 
最初支持的平台:Linux / x64 
 
如何使用 使用:Linux/x64下编译JDK时:--with-jvm-features=zgc
命令行参数:XX:+UnlockExperimentalVMOptions  -XX:+UseZGC
比较 吞吐量:
 
暂停时间:
 
http://openjdk.java.net/jeps/333 
JDK11-TLS1.3 实现了传输层安全(TLS)协议RFC 8446的1.3版
TLS 1.3是TLS协议的重大改进,与以前的版本相比,它提供了显著的安全性和性能改进。 其他供应商的几个早期实现已经可用。 我们需要支持TLS 1.3以保持竞争力并与最新标准保持同步。
1 2 3 4 5 6 7 8 9 10 11 @Test public  void  useTLS ()  throws  IOException {    String  host  =  "www.baidu.com" ;     int  port  =  443 ;     SocketFactory  basicSocketFactory  =  SocketFactory.getDefault();     Socket  s  =  basicSocketFactory.createSocket(host, port);          SSLSocketFactory  tlsSocketFactory  =  (SSLSocketFactory) SSLSocketFactory.getDefault();     s = tlsSocketFactory.createSocket(s, host, port, true );      } 
 
TLS参考:http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html  
http://openjdk.java.net/jeps/332 
RFC8446: https://tools.ietf.org/html/rfc8446 
如何使用TLS:https://stackoverflow.com/questions/24868820/how-to-make-tls-work-with-java/24872636 http://www.java2s.com/Tutorial/Java/0490__Security/SSLClientSession.htm 
传输层 https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E5%B1%82 
JDK11-Curve25519 and Curve448 RFC 7748定义了一种密钥协商方案,该方案比现有的椭圆曲线Diffie-Hellman(ECDH)方案更有效(原来的是C实现的,现在可以用纯Java实现)和安全。 此JEP的主要目标是API和此标准的实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test public  void  keyAgreementTest ()  throws  NoSuchAlgorithmException,        InvalidAlgorithmParameterException, InvalidKeySpecException, InvalidKeyException {     KeyPairGenerator  kpg  =  KeyPairGenerator.getInstance("XDH" );     NamedParameterSpec  paramSpec  =  new  NamedParameterSpec ("X25519" );     kpg.initialize(paramSpec);     KeyPair  kp  =  kpg.generateKeyPair();     KeyFactory  kf  =  KeyFactory.getInstance("XDH" );     BigInteger  u  =  new  BigInteger ("1212324324" );     XECPublicKeySpec  pubSpec  =  new  XECPublicKeySpec (paramSpec, u);     PublicKey  pubKey  =  kf.generatePublic(pubSpec);     KeyAgreement  ka  =  KeyAgreement.getInstance("XDH" );     ka.init(kp.getPrivate());     ka.doPhase(pubKey, true );     byte [] secret = ka.generateSecret();     System.out.println(Arrays.toString(secret)); } 
 
http://openjdk.java.net/jeps/324 
RFC定义的椭圆算法:https://tools.ietf.org/html/rfc7748 
JDK11-Deprecate Nashorn 弃用Nashorn JavaScript脚本引擎和API以及jjs工具,在将来的版本中可能会删除它们,如果一群可靠的开发人员表达出对Nashorn前进的明确愿望,那么这个JEP可以取消的
原因:随着ECMAScript语言构建的快速步伐以及API的调整和修改,JDK发现Nashorn难以维护
http://openjdk.java.net/jeps/335 
 
JDK11-基于Nest的访问控制 在以前的private public protected的基础上,JVM又提供了一种新的访问控制机制:Nest。
Java代码都是以类为单位组织的,而且即使是在一个.java文件中的多个类也都会被分别编译为不同的.class类文件。但是对于开发者来说,在一个源文件中的代码在逻辑上应该是可以互相访问的,但是Java并不直接允许这样做。我们虽然可以在一个匿名内部类中访问外层类的成员方法,但是这实际上是通过编译器自动生成的所谓 访问桥(access bridge) 方法进行访问。这个解决方案在解决一部分问题的同时,也带来了如增加了不必要的程序大小和额外性能损耗等问题,而且很容易迷惑一部分Java程序员。
而JDK 11带来的Nest就是一个更完善的解决方案。编译器现在把一些 看起来 是在一个类中的代码(如上面提到的匿名内部类)组织到Nest 中。而在同一个Nest中的类将会拥有同等的访问权限。这会让应用程序和字节码更加简单、安全,并对开发者透明。
Java作为一种相对保守的语言,这是少数几个对《Java语言规范》和《Java虚拟机规范》做出较大改动的JEP之一。然而对于普通开发者,在通常的开发中也不会有很大的变动。但是对于反射的重度使用者或接触字节码工程的人来说,这个JEP还是有必要仔细了解一下的。
http://openjdk.java.net/jeps/181 
https://xsun.io/2018/06/29/jdk11-preview/ 
JDK11-其他更新 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 更新到Unicode 10标准 Java SE 10实现了Unicode 8.0。 Unicode 9.0增加了7,500个字符和6个新脚本,Unicode 10.0.0增加了8,518个字符和4个新脚本。 此升级将包括Unicode 9.0更改,因此添加了总共16,018个字符和10个新脚本。 主要影响的类: Character and String in the java.lang package, NumericShaper in the java.awt.font package, Bidi, BreakIterator, and Normalizer in the java.text package. 弃用Pack200工具和API 在java.util.jar中弃用pack200和unpack200工具以及Pack200 API。 实现ChaCha20和Poly1305密码算法 实现RFC 7539中指定的ChaCha20和ChaCha20-Poly1305密码.ChaCha20是一种相对较新的流密码,可以替代旧的,不安全的RC4流密码。 动态类文件常量 这个JEP扩展了Java类文件格式来支持一种新形式的常量池,CONSTANT_Dynamic。它在初始化的时候,会像invokedynamic指令生成代理方法一样,委托给一个初始化方法进行创建。这是一个JVM内部的特性,对上层软件没有很大的影响,但是为Java语言未来的重大变化铺设了道路。 
 
Unicode10:http://openjdk.java.net/jeps/327 
Pack200:http://openjdk.java.net/jeps/336 
http://openjdk.java.net/jeps/309 
参考 https://dzone.com/articles/features-of-java-11
 
http://openjdk.java.net/jeps/320
 
http://openjdk.java.net/jeps/321 
HTTP Client的用法:http://openjdk.java.net/groups/net/httpclient/recipes.html 
Client介绍:http://openjdk.java.net/groups/net/httpclient/intro.html