前言
自从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和暴露出去的模块requires: 需要的依赖1
2
3
4module com.ming{
requires com.apache;
exports com.sql;
}
exports: 暴露除去提供其他模块访问使用
module-info.java 在module根目录 提供给jlink去解析处理
- jlink
参考文档:https://www.cnblogs.com/IcanFixIt/p/7110790.html?utm_source=debugrun&utm_medium=referral
根据模块配置 将项目依赖打包成jmod 组装成image 提供运行环境
jlink –help
- jmod
java创建模块 cli
jmod –help
- jimage
查看jlink生成的jimage内容
jimage –help
jshell
提供一个包含java环境的shell终端 测试一些简单代码的效果的时候 可以用一用
用处一般
1 | # 进入shell |
http2
jdk默认携带的http客户端 毛病实在是太多了 之前一直使用的是第三方的 如httpClient okHttp 等
jdk9 之后 升级了jdk默认的http客户端 并且对http1.0,1.1,2.0等功能 有了比较完整的支持
特别是http2.0
1 | package com.ming; |
jvm
- 统一日志
- 默认g1
- 代码分段缓存
- aot技术 graal
jdk10
jdk10 也是个短期版本 变动不多
下面还是捡起有兴趣的记录下
局部变量类型推断
也就是 var 就是一个语法糖 用处有点用把 度写java了 用var 顶多就是一些简单的地方用
1 | var i = new ArrayList<String>(); |
jvm
- g1 完善并行gc
- 提供gc接口
- 提供在非dram之外的内存、磁盘上堆分配配置 -XX:AllocateHeapAt=
jdk11(lts)
11是一个长期支持版本 建议如果允许 可以升级到11 来享受之前9 10的特性 如g1并行gc 等
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短期版本
Shenandoah 可暂停式垃圾收集器 beta
制定gc安全点时间 保证每次gc耗时一致 通过暂停回收工作来达到
switch 表达式 preview
idea 使用的时候 要打开启用 preview开关
1 | package com.ming; |
cds
使用cds 生成内存dump 减少下次启动、重启时候需要的时间 jdk11 默认启动
-Xshare:dump 启动
-Xshare:off 禁用
g1垃圾收集器优化
- 可暂停回收 类似Shenandoah gc 但是有所不同
- 空闲时自动将java堆 归还给操作系统
jdk13
短期版本
动态cds
增强cds功能 提供把已经加载的程序类和库类作cds归档 也是 -Xshare:dump 启用
zgc优化
增强ZGC,以将未使用的堆内存返回给操作系统。 减少内存占用
switch 表达式调整 preview
进一步调整 switch表达式 增加yield 指定返回值
文本块 preview
实用功能 类似 groovy中的 在很多地方 避免丑陋的字符串+字符串
1 | package com.ming; |
jdk14
编写笔记的时候 14刚刚整体功能冻结
已经提出的功能如下:
- g1 优化
- 其它平台zgc实现
- instanceof 模式匹配
- 删除cms这种老的垃圾收集器
…
总结
如果是新项目 而且需要适配容器 建议jdk11 因为 一是lts版本 二是可以拆分模块 三是性能稍微好点 而且一般的框架稳定版本基本上也只适配到11
如果是自己玩玩 练手 13搞起
java 也在与时俱进 该有的功能 不会少 毕竟用的公司多 而且大厂也多
总的来说 从jdk8升级到高版本之后 主要有如下几个功能比较有意思
- 新的gc g1并行 zgc
- 新的语法糖 var switch 等
- 模块化 jigsaw
- cds
- 文本块
后面准备对其中的 模块化和cds专门写一篇笔记 因为我觉得在云原生时代 小包+快速启动才是比较理想的方式
至于gc 我比较期待zgc成熟和g1的可暂停回收功能成熟的哪一天 因为jvm在gc的时候 真的是很操蛋