0%

jdk9,10,11,12,13,14主要新功能

前言

自从jdk8之后 新的sdk功能基本没仔细看
最近觉得在不看 就要落伍了 找个时间根据openjdk的发版情况结合大佬们的博客 记录一下

jdk8 主要就是提供了一些语法糖和一些优化功能 极大的减少了一些数据处理和异常处理的代码量 也提供了新的gc处理器

jdk 版本和安装方式

openjdk官网: http://openjdk.java.net/

所有jdk 全部以openjdk为准 分为:
openjdk 9.x
openjdk 10.x
openjdk 11.x
openjdk 12.x
openjdk 13.x
openjdk 14.x(预览)

全部采用 sdkman安装和管理

jdk9

官方新特征列表: http://openjdk.java.net/projects/jdk9/ 主要是jsr379相关规范

jdk9 说实话 更新真特么多 什么http2 什么模块化 什么jvm日志统一 调整默认gc为g1等
下面对比较有意思的功能做个记录

模块化

官方文档:http://openjdk.java.net/jeps/261
jigsaw: http://openjdk.java.net/projects/jigsaw/spec/sotms/

模块化 算是我非常期待的一个功能 在云原生 这种时代 能够裁减sdk 减小分发的消耗 减小无用的功能 有着特别的作用
在jdk8的时候 总是谣传要出 结果由于过于复杂没有发布 jdk9 终于还是上线了 美滋滋

  • module-info.java
    参考文档: https://www.cnblogs.com/IcanFixIt/p/6947763.html
    使用 module-info.java来描述定义当前module依赖的module和暴露出去的模块
    1
    2
    3
    4
     module com.ming{
    requires com.apache;
    exports com.sql;
    }
    requires: 需要的依赖
    exports: 暴露除去提供其他模块访问使用

module-info.java 在module根目录 提供给jlink去解析处理

jlink –help

  • jmod
    java创建模块 cli

jmod –help

  • jimage
    查看jlink生成的jimage内容

jimage –help

jshell

提供一个包含java环境的shell终端 测试一些简单代码的效果的时候 可以用一用
用处一般

1
2
# 进入shell 
jshell
http2

jdk默认携带的http客户端 毛病实在是太多了 之前一直使用的是第三方的 如httpClient okHttp 等
jdk9 之后 升级了jdk默认的http客户端 并且对http1.0,1.1,2.0等功能 有了比较完整的支持
特别是http2.0

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
package com.ming;


import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

/**
* 测试 jdk自带的httpClient
*
* @author ming
* @date 2020-01-12 14:35:55
*/
public class HttpClientTest {
public static void main(String[] args) throws IOException, InterruptedException {
//创建默认的httpClient 如果定制可以使用build函数
HttpResponse<String> response = HttpClient.newHttpClient().send(HttpRequest.newBuilder()
//发起get请求
.GET()
//请求百度
.uri(URI.create("https://baidu.com"))
//使用http2
.version(HttpClient.Version.HTTP_2)
.build(), HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}

jvm
  • 统一日志
  • 默认g1
  • 代码分段缓存
  • aot技术 graal

jdk10

jdk10 也是个短期版本 变动不多

官方文档: http://openjdk.java.net/projects/jdk/10/

下面还是捡起有兴趣的记录下

局部变量类型推断

也就是 var 就是一个语法糖 用处有点用把 度写java了 用var 顶多就是一些简单的地方用

1
var i = new ArrayList<String>();
jvm
  • g1 完善并行gc
  • 提供gc接口
  • 提供在非dram之外的内存、磁盘上堆分配配置 -XX:AllocateHeapAt=

jdk11(lts)

11是一个长期支持版本 建议如果允许 可以升级到11 来享受之前9 10的特性 如g1并行gc 等

官方文档: http://openjdk.java.net/projects/jdk/11/

Epsilon 无操作垃圾收集器 beat

此垃圾收集器 不进行任何垃圾回收操作 当堆耗尽 直接关闭jvm
-XX:+UseEpsilonGC 启用

隐式lambda型参类型

使用var 来表示lambda中参数类型

1
(var a, var b) -> a*b 
Flight Recorder 飞行记录器

oracle jdk 出了很久了 11版本之后 源码开放

启动单文件程序

java命令直接可以启动但个xxx.java文件 不需要手动进行javac编译

1
java xxx.java 
低开销堆分析

提供分析 堆转储 堆直方图等信息

zgc 低延迟垃圾收集器 beta

新的垃圾收集器 和其他不同的是 专门用来处理小堆 延迟不超过10ms
使用方式:
1:构建jdk 需要启用 –with-jvm-features=zgc 高版本的默认已经打包进去了
2:jvm启动需要指定: -XX:+UnlockExperimentalVMOptions -XX:+UseZGC

jdk12

12短期版本

官方文档: http://openjdk.java.net/projects/jdk/12/

Shenandoah 可暂停式垃圾收集器 beta

制定gc安全点时间 保证每次gc耗时一致 通过暂停回收工作来达到

switch 表达式 preview

idea 使用的时候 要打开启用 preview开关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.ming;

/**
* 测试 switch 表达式
*
* @author ming
* @date 2020-01-12 16:33:11
*/
public class SwitchExpressionsTest {

public static void main(String[] args) {
int a = 1;
//switch返回结果
var result = switch (a) {
//简写
case 1 -> 1;
//多个条件简写
case 2, 3 -> 3;
default -> 0;
};
System.out.println(result);
}
}
cds

使用cds 生成内存dump 减少下次启动、重启时候需要的时间 jdk11 默认启动
-Xshare:dump 启动
-Xshare:off 禁用

g1垃圾收集器优化
  • 可暂停回收 类似Shenandoah gc 但是有所不同
  • 空闲时自动将java堆 归还给操作系统

jdk13

短期版本

官方文档: http://openjdk.java.net/projects/jdk/13/

动态cds

增强cds功能 提供把已经加载的程序类和库类作cds归档 也是 -Xshare:dump 启用

zgc优化

增强ZGC,以将未使用的堆内存返回给操作系统。 减少内存占用

switch 表达式调整 preview

进一步调整 switch表达式 增加yield 指定返回值

文本块 preview

实用功能 类似 groovy中的 在很多地方 避免丑陋的字符串+字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.ming;

/**
* 测试 文本块
*
* @author ming
* @date 2020-01-12 16:33:11
*/
public class SwitchExpressionsTest {

public static void main(String[] args) {
var str = """
asdfasdf
asdfasdf
asdfasd
""";
System.out.println(str);
}
}

jdk14

编写笔记的时候 14刚刚整体功能冻结

官方文档: http://openjdk.java.net/projects/jdk/14/

已经提出的功能如下:

  • g1 优化
  • 其它平台zgc实现
  • instanceof 模式匹配
  • 删除cms这种老的垃圾收集器

总结

如果是新项目 而且需要适配容器 建议jdk11 因为 一是lts版本 二是可以拆分模块 三是性能稍微好点 而且一般的框架稳定版本基本上也只适配到11
如果是自己玩玩 练手 13搞起
java 也在与时俱进 该有的功能 不会少 毕竟用的公司多 而且大厂也多
总的来说 从jdk8升级到高版本之后 主要有如下几个功能比较有意思

  • 新的gc g1并行 zgc
  • 新的语法糖 var switch 等
  • 模块化 jigsaw
  • cds
  • 文本块

后面准备对其中的 模块化和cds专门写一篇笔记 因为我觉得在云原生时代 小包+快速启动才是比较理想的方式
至于gc 我比较期待zgc成熟和g1的可暂停回收功能成熟的哪一天 因为jvm在gc的时候 真的是很操蛋