JDK的选择
JDK的选取
首先说一下JDK的版本变化,科普科普。
JDK版本变化
起源
Java 语言源于 1991 年 Sun 公司 James Gosling 领导的的 Ork 项目,1995 年 Sun 公司正式起名为 Java,并提出“Write once, Run anywhere”的口号。
JDK 1.0
开发代号为Oak(橡树),于1996年1月23发行。特点有:
- 提供了一个解释执行的 Java 虚拟机;
- Applet 能在 Mozilla 浏览器中运行。
Java 的 Applet 能在 Mozilla 浏览器中运行,被看作是未来的互联网语言。
JDK 1.1
于 1997年2月19日发行,新特性有:
- 引入JDBC(Java Database Connectivity);
- 支持内部类;
- 引入Java Bean;
- 引入RMI(Remote Method Invocation);
- 引入反射(仅用于内省)。
Java 语言的基本形态基本确定了,比如反射 (reflection), JavaBean, 接口和类的关系等等,一直到今天都保持一致。然而,Java 最初的一些目标,如在浏览器中执行 Applet,以及跨平台的图形界面 Awt 很快遭遇到负面的评价。
JDK 1.2
开发代号为 Playground(操场),于1998年12月8日发行。新特性有:
- 引入集合(Collection)框架;
- 对字符串常量做内存映射;
- 引入 JIT(Just In Time) 编译器;
- 引入对打包的 Java 文件进行数字签名;
- 引入控制授权访问系统资源的策略工具;
- 引入 JFC(Java Foundation Classes),包括 Swing 1.0、拖放和 Java 2D 类库;
- 引入 Java 插件;
- 在 JDBC 中引入可滚动结果集、BLOB、CLOB、批量更新和用户自定义类型;
- 在 Applet 中添加声音支持。
Java 第一个里程碑式的版本。JIT(Just in time)编译器技术,使得语言的可迁移性和执行效率达到最优的平衡,同时 Collections 集合类设计优良,在企业应用开发中迅速得到了广泛使用。
Sun 公司把 Java 技术体系分成三个方向,分别是 J2SE(面向桌面和通用应用开发),J2EE(面向企业级应用开发),J2ME(面向移动终端开发)。这个分类影响非常久远,体现出主流语言设计者的思想:针对于不同的应用领域,在形态,API 集合等进行划分。
JDK 1.3
开发代号为 Kestrel(红隼),于2000年5月08日发行。新特性有:
- 引入Java Sound API;
- jar 文件索引;
- 对 Java 的各个方面都做了大量优化和增强。
J2EE 中的 Servlet 规范获得了极大的成功,伴随着互联网的兴起,和浏览器直接通过 HTTP 协议交互的 Servlet,和众多的 MVC 框架,成为 Web1.0 的网红。
JDK 1.4
开发代号为 Merlin(隼),于2004年2月06日发行(首次在JCP下发行)。新特性有:
- XML 处理;
- Java 打印服务;
- 引入 Logging API;
- 引入 Java Web Start;
- 引入 JDBC 3.0 API;
- 引入断言;
- 引入 Preferences API;
- 引入链式异常处理;
- 支持 IPv6;
- 支持正则表达式;
- 引入 Image I/O slot machine API。
Java 语言真正走向成熟,提供了非常完备的语言特性,如 NIO,正则表达式,XML 处理器等。
同年微软的.NET 框架发布,两者开始了为期十几年的暗自竞争。从语言特性上来说,.NET 后发先至,一直处于优势。但 Java 依赖良好的开发者生态,绝大多数大型软件公司的使用者众多和不断贡献,以及对 Linux 操作系统良好的支持,渐渐的在服务器端获得优势地位。
JDK 5
开发代号为Tiger(老虎),于2004年9月30日发行。新特性包有:
- 引入泛型;
- 增强循环,可以使用迭代方式;
- 自动装箱与自动拆箱;
- 类型安全的枚举;
- 可变参数;
- 静态引入;
- 元数据(注解);
- 引入 Instrumentation。
Sun 不再采用 J2SE, J2EE 这种命名方式,而使用 Java SE 5, Java EE 5 这样的名称。
Java 5 是第二个里程碑式的版本。Java 语言语法发生很大的变化,如注解 (Annotation),装箱 (Autoboxing),泛型 (Generic),枚举 (Enum),foreach 等被加入,提供了 java.util.concurrent 并发包。
Java 5 对于 Java 语言的推动是巨大的,特别是注解的加入,使得语言定义灵活了很多,程序员可以写出更加符合领域定义的描述性程序。
JDK 6
开发代号为 Mustang(野马),于2006年12月11日发行。新特性有:
- 支持脚本语言;
- 引入 JDBC 4.0 API;
- 引入 Java Compiler API;
- 可插拔注解;
- 增加对 Native PKI(Public Key Infrastructure)、Java GSS(Generic Security Service)、Kerberos 和 LDAP(Lightweight Directory Access Protocol) 的支持;
- 继承 Web Services;
- 做了很多优化。
这个语言语法改进不多,但在虚拟机内部做了大量的改进,成为一个相当成熟稳定的版本,时至今日国内的很多公司依然以 Java6 作为主要 Java 开发版本来使用。
同年 Sun 公司做出一个伟大的决定,将 Java 开源。OpenJDK 从 Sun JDK 1.7 版本分支出去,成为今天 OpenJDK 的基础。
JDK 7
开发代号是 Dolphin(海豚),于2011年7月28日发行。新特性有:
switch
语句块中允许以字符串作为分支条件;- 在创建泛型对象时应用类型推断;
- 在一个语句块中捕获多种异常;
- 支持动态语言;
- 支持
try-with-resources
; - 引入 Java NIO.2 开发包;
- 数值类型可以用2进制字符串表示,并且可以在字符串表示中添加下划线;
- 钻石型语法;
null
值的自动处理。
这个版本中的主要的特性是 NIO2 和 Fork/Join 并发包,Java 虚拟机的稳定性真正做到的工业级,成为一个计算平台而服务于全世界。
JDK 8
JDK 8 于2014年3月14号发布。从 Java 8 开始开发代号已经弃用了。新特性有:
- Lambda 表达式
- Pipelines 和 Streams
- Date 和 Time API
- Default 方法
- Type 注解
- Nashhorn JavaScript 引擎
- 并发计数器
- Parallel 操作
- 移除 PermGen Error
- TLS SNI
第三个有里程碑意义的 Java 版本。其中最引人注目的便是 Lambda 表达式了,从此 Java 语言原生提供了函数式编程能力。Java 8 更加适应海量云计算的需要。
具体的特性包括:
- JEP 117: 移除注解处理工具(Annotation-Processing Tool,apt)。
- JEP 124: 增强证书撤销检查 API。
- JEP 130: 实现 SHA-224 消息摘要算法。
- JEP 131: 在 64-bit Windows 中支持 PKCS#11。
- JEP 112: Charset 实现改善。
- JEP 129: 实现 NSA Suite B 加密算法。
- JEP 105: DocTree API。
- JEP 106: 扩展
javax.tools
API 来支持 javadoc 的访问。 - JEP 113: 在 JDK 的 Kerberos 5 中添加 MS-SFU 扩展。
- JEP 114: TLS Server Name Indication (SNI) 扩展。
- JEP 121: 提供更强的 Password-Based-Encryption (PBE) 算法实现。
- JEP 122: 移除永久带(Permanent Generation)。
- JEP 127: 改善 Locale Data Packaging,并且采用 Unicode CLDR Data。
- JEP 128: Unicode BCP 47 本地匹配。
- JEP 133: 支持 Unicode 6.2。
- JEP 136: 增强错误验证。
- JEP 153: 启动 JavaFX 应用。
- JEP 177: 优化
java.text.DecimalFormat.format
。 - JEP 103: 并行数组排序。
- JEP 135: Base64 编码和解码。
- JEP 138: 基于 Autoconf 的自动构建系统。
- JEP 139: 增强 javac 来提高构建速度。
- JEP 142: 减少对于特定域的高速缓存的争夺。
- JEP 147: 减少类元数据占用。
- JEP 148: 支持小虚拟机(不超过3M)的创建。
- JEP 149: 减少核心库的内存使用。
- JEP 150: 新的 Date 和 Time API。
- JEP 160: lambda 函数表达式。
- JEP 164: 利用 CPU 指令进行 AES 加密。
- JEP 166: 针对JKS、JCEKS、PKCS12秘钥存储的修改。
- JEP 170: JDBC 4.2。
- JEP 172: DocLint。
- JEP 173: 放弃一些很少使用的 GC 组合。
- JEP 101: 泛华目标类型接口。
- JEP 104: 在 Java 类型上加注解。
- JEP 107: 增加集合的批量数据操作。
- JEP 109: 在核心库中增加 Lambda 表达式。
- JEP 115: 认证加密的密码套件。
- JEP 118: 在运行时访问参数名称。
- JEP 119: 通过反射实现
javax.lang.model.*
API。 - JEP 120: 重复注解。
- JEP 123: 可配置的安全随机数生成。
- JEP 126: lambda 表达式和虚拟扩展方法。
- JEP 140: 限制的 doPrivileged。
- JEP 155: 并发库更新。
- JEP 161: 紧凑版本。
- JEP 162: 为模块化做准备。
- JEP 171: 在
sun.misc.Unsafe
中增加三个内存排序相关的指令。 - JEP 174: Nashorn JavaScript 引擎。
- JEP 176: 提供调用者敏感的检测机制。
- JEP 178: 静态链接的 jni 库。
- JEP 179: JDK API 的文档的支持和稳定。
- JEP 180: 对于频繁冲突的 HashMap 使用平衡树。
- JEP 184: HTTP URL的权限。
- JEP 185: 限制外部 XML 资源的获取。
JDK 9
JDK 9 于2017年9月21日发布。新特性有:
- 模块化 —— Jigsaw
- 交互式命令行 —— JShell
- 默认的垃圾回收器 —— G1
- 进程操作改进
- 竞争锁的性能优化
- 分段代码缓存
- 优化字符串占用空间
这个版本中最引人注目的时候模块化,通过这个工作,可以构建更小的运行时环境,只需要包括Java平台中任务依赖的部分。这可以更好地适应云端的开发。
具体的特性包括:
- JEP 102: 改善了控制和管理操作系统进程的 API。
- JEP 110: 定义了一个新的 Http 客户端 API,它实现了
HTTP/2
和WebSocket
,并且可以替代遗留的HttpURLConnection
API。该 API 将会以一个 incubator 模块的形式进行交付。 - JEP 143: 提高竞争 Java 对象的监视性能。
- JEP 158: 统一 JVM 的日志。
- JEP 165: 通过支持运行时管理来增加对 JVM 编译器的管理。
- JEP 193: 对变量处理的改进。
- JEP 197: 将代码缓存划分成不同的段。
- JEP 200: 采用 Java 平台模块化系统(Java Platform Module System,JPMS)对JDK进行模块化。
- JEP 201: 源代码模块化。
- JEP 211: 在 import 语句中 省略
deprecation
的警告。 - JEP 212: 解决 lint 和 doclint 警告。
- JEP 213: Project Coin 的改变
- JEP 214: 移除 JDK 8 中 GC 组合器的废弃说明。
- JEP 215: 在 javac 中实现了一个新的类型检测策略。
- JEP 216: 正确地处理导入声明。
- JEP 217: 注解流水线 2.0。
- JEP 219: 定义了数据传输层安全(Datagram Transport Layer Security, DTLS)API。
- JEP 220: 模块化运行时镜像。
- JEP 221: 简化
Doclet
API。 - JEP 222: jshell - Java 中的交互式命令行。
- JEP 223: 新的版本字符串模式。
- JEP 224: 增强了 javadoc 工具来生成 HTML5 标记。
- JEP 225: 增加了 javadoc 搜索。
- JEP 226: UTF-8 属性文件资源的Bundle相关变化。
- JEP 227: Unicode 7.0。
- JEP 228: 增加更多可诊断的命令。
- JEP 229: 将默认的秘钥库从 JKS 替换为 PKCS12。
- JEP 231: 移除运行时 JRE 版本选择。
- JEP 232: 增强了安全相关应用的性能。
- JEP 233: 开发了一个工具来自动测试运行时编译器。
- JEP 235: 增加关于 javac 生成类文件属性的 测试。
- JEP 236: 定义了解析 API 来支持 Nashorn 的 ECMAScript 抽象语法树。
- JEP 237: Linux/AArch64 端口相关。
- JEP 238: 多版本 JAR 文件。
- JEP 240: 移除 JVM 的 TI hprof 客户端。
- JEP 241: 移除 jhat 工具。
- JEP 243: 提供 Java 语言级的 JVM 编译接口。
- JEP 244: TLS 应用层协议协商。
- JEP 245: 验证 JVM 命令行标志参数。
- JEP 246: 利用 CPU 指令提升 GHASH 和 RSAd 的性能。
- JEP 247: 对老平台版本的编译支持。
- JEP 248: G1 作为默认的垃圾回收器。
- JEP 249: 基于 TLS 实现 OCSP Stapling。
- JEP 250: 在类数据分享(CDS)归档中存储 interned 字符串。
- JEP 251: 多方案镜像。
- JEP 252: 默认使用 CLDR Locale Data。
- JEP 253: 为 JavaFX UI 控制 和 CSS API 的模块化做准备。
- JEP 254: 采用一个空间更加高效的 String 内部表示。
- JEP 255: 合并 Xerces 2.11.0 中的更新。
- JEP 256: BeanInfo 注解调整。
- JEP 257: 更新 JavaFX/Media 中 GStreamer 的版本。
- JEP 258: 使用 HarfBuzz 作为字体布局引擎。
- JEP 259: 定义了一个高效标准的 Stack-Walking API。
- JEP 260: 封装大部分的内部 API。
- JEP 261: 实现模块化系统。
- JEP 262: 支持 TIFF 图像 I/O。
- JEP 263: 实现 Windows 和 Linux 高分辨率图像接口。
- JEP 264: 平台日志 API 和 服务。
- JEP 265: Java 2D 使用 Marlin Graphics Renderer。
- JEP 266: 并发相关的一些更新。
- JEP 267: 支持 Unicode 8.0。
- JEP 268: 支持 XML 目录。
- JEP 269: 增加一些集合类创建的工厂方法。
- JEP 270: 为临界区预留栈的某些区域。
- JEP 271: 统一 GC 日志。
- JEP 272: 增加特定平台的桌面特性。
- JEP 273: Deterministic Random Bit Generator (DRBG) 的实现。
- JEP 274: 增强方法处理器。
- JEP 275: Java 应用模块化打包。
- JEP 276: 语言定义对象模型的动态链接。
- JEP 277: 改善 Deprecation。
- JEP 278: 为 G1 中的巨大对象增加测试。
- JEP 279: 改进测试故障排除。
- JEP 280: 指示字符串串联。
- JEP 281: HotSpot C++ 单元测试框架。
- JEP 282: Java连接器 jlink。
- JEP 283: 在 Linux 上支持 GTK 3。
- JEP 284: 新的 HotSpot 构建系统。
- JEP 285: 自旋等待提示。
- JEP 287: 实现 SHA-3 Hash 算法。
- JEP 288: 禁止 SHA-1 验证。
- JEP 289: 废弃 Applet API。
- JEP 290: 过滤输入的序列化数据。
- JEP 291: 废弃 Concurrent Mark Sweep (CMS) 垃圾收集器。
- JEP 292: 在 Nashorn 中支持 ECMAScript 6 特征。
- JEP 294: Linux/s390x 端口。
- JEP 295: 提前编译。
- JEP 297: 统一 arm32/arm64 端口。
- JEP 298: 移除过时的例子。
- JEP 299: 重新组织文档。
JDK 10
JDK 10 按计划将于2018年3月20日发布。新特性有:
- JEP 286: 局部变量的类型推导。该特性在社区讨论了很久并做了调查,可查看 JEP 286 调查结果。
- JEP 296: 将 JDK 的多个代码仓库合并到一个储存库中。
- JEP 304: 垃圾收集器接口。通过引入一个干净的垃圾收集器(GC)接口,改善不同垃圾收集器的源码隔离性。
- JEP 307: 向 G1 引入并行 Full GC。
- JEP 310: 应用类数据共享。为改善启动和占用空间,在现有的类数据共享(“CDS”)功能上再次拓展,以允许应用类放置在共享存档中。
- JEP 312: 线程局部管控。允许停止单个线程,而不是只能启用或停止所有线程。
- JEP 313: 移除 Native-Header Generation Tool (javah)
- JEP 314: 额外的 Unicode 语言标签扩展。包括:cu (货币类型)、fw (每周第一天为星期几)、rg (区域覆盖)、tz (时区) 等。
- JEP 316: 在备用内存设备上分配堆内存。允许 HotSpot 虚拟机在备用内存设备上分配 Java 对象堆。
- JEP 317: 基于 Java 的 JIT 编译器(试验版本)。
- JEP 319: 根证书。开源 Java SE Root CA 程序中的根证书。
- JEP 322: 基于时间的版本发布模式。“Feature releases” 版本将包含新特性,“Update releases” 版本仅修复 Bug 。
JDK 11
JDK 11 目前出现了4个JEP,计划于 2018 年 9 月发布。
- JEP 309: 动态类文件常量。
- JEP 318: 低开销垃圾收集器 Epsilon。
- JEP 320: 移除 Java EE 和 CORBA 模块。
- JEP 323: Lambda 参数的本地变量语法。
JDK 14 等更多版本…
版本很多,我们根据需要去选择。一般情况下,企业集开发多数使用 JDK 1.8 版本的JDK。
主要原因是它经得住长期运行的考验,新版的JDK有更多不可控因素,企业经不住这样的折腾。
所以选择 JDK 1.8。
JDK版本选择
现在的JAVA JDK 主要有以下版本:
- Oracle JDK
- Open JDK
- IBM IDK
- Harmony JDK
- HP JDK
- Alibaba Dragonwell
个人比较偏向于Ali,久经大型电商平台的考验,以下是官网地址:
具体选择看个人。