Java技术体系与JDK发展史,你知道嘛?

1、Java技术体系

        从广义上讲,ClojureJRubyGroovy等运行于Java虚拟机上的语言及其相关的程序都属于Java技术体系的一员。

        如果仅从传统意义上来看,Sun官方定义的Java技术体系包括以下几个组成部分:

  •  Java程序设计语言
  •  各种硬件平台上的Java虚拟机
  •  Class文件格式
  •  Java API类库
  •  来自商业机构和开源社区的第三方Java类库

        其中,Java程序设计语言,Java虚拟机,Java API类库这三部分就是传说中的JDK了(Java Development Kit),JDK是用于支持Java程序开发的最小环境。另外,Java API类库中的Java SE API子集和Java虚拟机这两部分就是JDK的小弟JRE了,JRE是支持Java程序运行的标准环境。下图是Java技术体系所包含的内容,以及JDKJRE所涵盖的范围

uploading.4e448015.gif正在上传…重新上传取消

    以上是根据组成部分的功能来进行划分的,如果按照技术所服务的领域来划分,或者说按照Java技术关注的重点业务领域来划分,Java技术体系可以分为四个平台,分别为:

  •     Java Card:支持一些Java小程序(Applets)运行在小内存设备上(如智能卡)上的平台
  •     Java MEMicro Edition):支持Java程序运行在移动终端(手机,PDA)上的平台,对Java API有所精简,并加入了针对移动终端的支持,这个版本以前称为J2ME
  •     Java SEStandard Edition):支持面对桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API。这个版本以前称为J2SE
  •     Java EEEnterprise Edition):支持使用多层架构的企业应用(如ERPCRM应用)的Java平台,除了提供Java SE API外,还对其做了大量的扩充并提供了相关的部署支持,这个版本以前称为J2EE

2、JDK发展史

        时光荏苒,从第一个Java版本诞生到现在已经有25年的时间了。沧海桑田一瞬间啊,转眼25年就过去了,下图为Java技术发展的时间线:

uploading.4e448015.gif正在上传…重新上传取消

Oak (橡树)

        1991年4月,由James Gosling博土领导的绿色计划Green Projee开始启动,此计划的目的是开发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序架构。这个计划的产品就是Java语言的前身: Oak (橡树). Oak当时在消费品市场上并不算成功,但随着1995年互联网湖流的兴起,Oak迅速找到了最适合自己发展的市场定位井规变成为Java语言。

Java 1.0版本

        1995523日,Oak语言改名为Java,井且在SuWorld大会上正式发布Java 1.0版本,Java语言第次提出了“Wite Once, Run Anywhere"的口号。

        1996123日,JDK 1.0发布,Java语言有了第个正式版本的运行环境 JDK 1.0提供了一个纯解释执行的Java虚拟机实现(Sun Cassic VM). JDK 1.0版本的代表技术包括,Java虚拟机、Applet. AWT等。

        19964月,10个最主要的操作系统供应高中明将在其产品中嵌人Java技术。同年9月,已有大约83万个网页应用了Java技术来制作。在19965月底,Sun 公司于美国阳金山奉行了首届JavaOne大会,从此JavaOne成为全世界数百万Java语言开发者每年度的技术盛会。

JDK1.1

         1997219日,Sun公司发布了JDK1.1Java技术的一些最基础的支撑点(如JDBD等)都是在JDK1.1版本中发布的,JDK1.1版的技术代表有:JAR文件格式,JDBCJavaBeansRMIJava语法也有了一定的发展,如内部类(Inner Class)和反射(Reflection)都是在这个时候出现的。

        直到199448日,JDK一共发布了1.1.0~1.1.8九个版本,从1.1.4之后,每个JDK版本都有一个自己的名字(工程代号),分别为:JDK1.1.4-Sparkler(宝石),JDK1.1.5-Pumpkin(南瓜),JDK1.1.6-Abigail(阿比盖亚,女子名),JDK1.1.7-Brutus(布鲁图,古罗马政治家和将军)和JDK1.1.8-Chelsea(切尔西,城市名)。

JDK1.2

        1998124日,JDK迎来了一个里程碑式的版本JDK1.2,工程代号为Playground(这可不是操场,而是竞技场),Sun在这个版本中把Java技术体系拆分为三个方向,分别是面向桌面应用开发的J2SEJava 2 PlatformStandard Edition),面向企业级开发的J2EEJava 2 PlatformEnterprise Edition)和面向手机等移动终端开发的J2MEJava 2 PlatformMicro Edition)。在这个版本中出现的代表性技术非常多,如EJBJava Plug-inJava IDLSwing等,并且这个版本中Java虚拟机第一次内置了JITJust In Time)编译器(JDK1.2中曾并存过三个虚拟机,Classic VMHotSpot VMExact VM,其中Exact VM只在Solaris平台出现过:后面两个虚拟机都是内置JIT编译器的,而之前版本所带的Classic VM只能以外挂的形式使用JIT编译器)。在语言和API级别上,Java添加lstrictfp关键字与现在Java编码之中极为常用的一系列Collection集合类。在19993月和7月,分别有JDK1.2.1JDK1.2.2两个小版本发布。

        1999427日,HotSpot虚拟机发布,HotSpot最初由一家名为“Longview Technologies”的小公司开发,因为HotSpot的优异表现,这家公司在1997年被Sun公司收购了。HotSpot虚拟机发布时是作为JDK1.2的附加程序提供的,后来它成为了JDK1.3及之后所有版本的Sun JDK的默认虚拟机。

JDK1.3

        200058日,工程代号为Kestrel(美洲红隼)的JDK1.3发布JDK1.3相对于JDK1.2的改进主要表现在一些类库上(如数学运算和新的Timer API等),JNDI服务从JDK1.3开始最为一项平台及服务提供(以前JNDI仅仅是一项扩展),使用CORBA IIOP来实现RMI的通讯协议,等等。这个版本还对Java 2D做了很多改进,提供了大量新的Java 2D API,并且新添加了JavaSound类库。JDK1.3有一个修正版本JDK1.3.1,工程代号为(Ladybird)瓢虫,与2001517日发布。

    自从JDK13开始,Sum维持了一个习惯:大约每隔两年发布一个JDK的主版本,以动物命名,期间发布的各个修正版本则以是虫作为工程名称。

JDK 1.4

        2002213日,JDK 1.4发布,工程代号为Merlin (灰背集)JDK 1.4Java真正走向成熟的一个版本,Compag Fuits SAS Symbian, IBM等著名公司都有参与甚至实现自己独立的JDK 1.4.哪怕是在十多年后的今天,仍然有许多主流皮用(SpringHibermate. Struts )佳直接运行在JDK 1.4之上,或者继续发布能运行在JDK 1.4上的版本。JDK 1.4同样发布了很多新的技术特性,如正则表达式、异常链、NIO 日志类、XML解析器和XSLT转换器等。JDK 1.4有两个后续修正版: 2002916日发布的工程代号为Girsshopper (炸蜢)JDK 1.4.12003626日发布的工程代号为Mantis (蝗螂)JDK 1.4.2.

        2002年前后还发生了一件与Java没有直接关系,但事实上对Java的发展进程影响很大的事件,那就是微软公间的NET Famework发布了,这个无论是技术实现上还是目标用户上都与Java有很多相近之处的技术平台给Java带来了很多讨论、比较和竞争,.NET平台和Java平台之间声势浩大的教优执劣的论战到目前为止都在继续。

JDK 1.5

        2004930日,JDK 1.5发布,工程代号Tiger (老虎)JDK 1.2以来,Java 在语法层面上的变换一直很小, JDK 1.5Java语法易用性上做出了非常大的改进。例如,自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach 循环)等语法特性都是在JDK 1.5中加人的。在虚拟机和API层面上,这个版本改进了Java的内存模型(JavaMemory Model, JMM). 提供了java util concurrent井发包等。另外,JDK 1.5是官方声明可以支持Windows 9%平台的最后一个JDK版本。

JDK 1.6

        20061211日,JDK 1.6发布,工程代号Mustang (野马)在这个版本中,Sun终结了从JDK 1.2开始已经有8年历史的J2EEJ2SE J2ME的命名方式,启用Java SEJavaEE6. Java ME 6的命名方式。JDK 1.6的改进包括:提供动志语言支持(通过内置Morilla JavaScript Rhino引擎实现)、提供编译API和微型HTTP服务器API等。同时,这个版本对Java虚拟机内部做了大量改进,包括锁与同步、 垃圾收集、类加载等方面的算法都有相当多的改动。

        2006113日的JavaOne大会上,Sun公司宣布最终会将Java开源,并在随后的一年多时间里,陆续将JDK的各个部分在GPL v2GNU General Public License v2)协议下公开了源码,并建立了OpenJDK组织对这些源码进行独立管理。除了极少量的产权代码(Encumbered Code这部分代码大多是Sun本身也无权限进行开源处理的)外,OpenJDK几乎包括了Sun JDK的全部代码,OpenJDK的质量主管曾经表示,在JDK1.7中,Sun JDKOpenJDK除了代码文件头的版权注释外,代码基本完全一样,所以OpenJDK7Sun JDK1.7本质上就是同一套代码库开发的产品。

        JDK1.6发布以后,由于代码复杂性的增加,JDK开源,开发JavaFX,经济危机及Sun收购案等原因,SunJDK发展以外的事情上耗费了很多资源,JDK的更新没有在维持两年发布一个主版本的发展速度。JDK1.6到目前为止一共发布了37Update版本,最新的版本为Java SE 6 Update 37,与20121016日发布。

JDK1.7

        2009219日,工程代号为Dolphin(海豚)的JDK1.7完成了其第一个里程碑版本,根据JDK1.7的功能规划,一共设置了10个里程碑,最后一个里程碑版本原计划于201099日结束,但由于各种原因,JDK1.7最终无法按计划完成。

        JDK1.7最开始的功能规划来看,它本应是一个包含许多重要改进的JDK版本,其中的Lambda项目(Lamabda表达式,函数式编程),Jigsaw项目(虚拟机模块化支持),动态语言支持。GarbageFirst收集器和Coin项目(语言细节进化)等子项目对于Java业界都会产生深远的影响。在JDK1.7开发期间,Sun公司由于相继在技术竞争和商业竞争中都陷入泥潭,公司的股票市值跌至仅有高峰期的3%,已无力推动JDK1.7的研发工作按正常计划进行。为了尽快结束JDK1.7长期跳票问题,Oracle公司收购Sun公司后不久便宣布将实行“B计划,大幅裁剪JDK1.7预定目标,以便保证JDK1.7的正式版能够于2011728日准时发布。“B计划把不能按时完成的Lambda项目,Jigsaw项目和Coin项目的部分改进延迟到JDK1.8之中。最终,JDK1.7的主要改进包括:提供新的G1收集器(G1在发布时依然处于Experimental状态,直至20124月的Update 4中才正式转正),加强对非Java语言的调用支持(JSR-292,这项特性到目前为止依然没有完全实现定型),升级类加载架构等。

        到目前为止,JDK1.7已经发布了9Update版本,最新的Java SE 7 Update 920121016日发布。从Java SE 7 Update 4起,Oracle开始支持Mac OS X操作系统,并在Update 6中达到完全支持的程度,同时,在Updane 6中还对ARM指令集架构提供了支持,至此,官方提供的JDK可以运行于Windows (不言Windous 9X)Linux Solaris Mac OS平台上,支持ARMx86. x64Sparc指令集架构类型。

         2009420日,Oracle 公司宣布正式以74亿美元的价格收购Sum公司,Java商标从此正式妇Oracle所有(Java语言本身并不属于哪间公司所有,它由JCP组织进行管理。尽管JCP主要是由Sun公司或者说Oracle公司所领导的)。由于此前Orasle公司已经收购了另外一家大型的中同件企业 BEA公司,在完成对Sun公司的收购之后,Oracle 公司分别从BEASun中取得了目前三大商业虚报机的其中两个: JRockit HosSpot. Oracle公司宣布在未来1~2年的时间内,将把这两个优秀的虚报机互相取长补短,最终合二为一。可以预见在不久的将来,Java 虚拟机技术将会产生相当巨大的变化。

JDK 1.8

         根据Oracle官方提供的信息,JDK 1.8Spider(蜘蛛))的第一个正式版本将于20139月发布,JDK 1.8将会提供在JDK 1.7中规划过,但最终未能在JDK 1.7 中发布的特性,即Lambda表达式、Jigsaw (很不幸,随后Oracle公司又宣布JigswJDK 1.8中依然无法完成。需要延至JDK1.9)JDK 1.7中未实现的一部分Coin等。

         2011年的JavaOne大会上,Oracle 公司还提到了JDK 1.9的长远规划,希望未来的Java虚拟机能够管理数以GB计的Java堆,能够更高效地与本地代码集成,并且令Java虚拟机运行时尽可能少人工干预,能够自动调节。

JDK 1.9

        JDK 1.92017921日发布,代表性技术包括:Java 平台级模块系统,LinkingJShell (交互式 Java REPL),改进的 Javadoc,改进的 Stream API,集合工厂方法,私有接口方法,HTTP/2,多版本兼容 JAR

JDK 10.0

JDK10.02018321日发布。

1.JEP286var 局部变量类型推断。

  • JEP296,将原来用 Mercurial 管理的众多 JDK 仓库代码,合并到一个仓库中,简化开发和管理过程。
  • JEP304,统一的垃圾回收接口。
  • JEP307G1 垃圾回收器的并行完整垃圾回收,实现并行性来改善最坏情况下的延迟。
  • JEP310,应用程序类数据 (AppCDS) 共享,通过跨进程共享通用类元数据来减少内存占用空间,和减少启动时间。
  • JEP312ThreadLocal 握手交互。在不进入到全局 JVM 安全点 (Safepoint) 的情况下,对线程执行回调。优化可以只停止单个线程,而不是停全部线程或一个都不停。
  • JEP313,移除 JDK 中附带的 javah 工具。可以使用 javac -h 代替。
  • JEP314,使用附加的 Unicode 语言标记扩展。
  • JEP317,能将堆内存占用分配给用户指定的备用内存设备。
  • JEP317,使用 Graal 基于 Java 的编译器,可以预先把 Java 代码编译成本地代码来提升效能。
  • JEP318,在 OpenJDK 中提供一组默认的根证书颁发机构证书。开源目前 Oracle 提供的的 Java SE 的根证书,这样 OpenJDK 对开发人员使用起来更方便。
  • JEP322,基于时间定义的发布版本,即上述提到的发布周期。版本号为$FEATURE.$INTERIM.$UPDATE.$PATCH,分别是大版本,中间版本,升级包和补丁版本。

 

JDK 11.0 

        JDK 11.02018925日发布

        JDK 11.0的代表性技术:

  • 一个局部变量类型推断,通过增强语言特性将类型推断扩展到局部变量,目的是减少与编码相关的仪式,同时保持对静态类型的安全承诺。
  • 一个干净的垃圾收集器接口,用来改善垃圾收集器源代码之间的隔离效果,这样可以为HotSpot 虚拟机中的内部垃圾收集代码提供更好的模块化功能,也可以更容易向 HotSpot 添加新的垃圾收集器。
  • 并行、完整的 G1 垃圾收集器,通过实现并行性来改善最坏情况下的延迟问题。
  • 启用 HotSpot 将对象堆分配给用户指定的备用内存设备(如 NVDIMM 内存模块),这个特性也侧面预示了未来的系统可能会采用异构的内存架构。
  • Linux / x64 平台上以实验性方式启用基于 Java 的即时编译器。
  • JDK 的多个存储库合并成一个,简化开发。目前的代码库被分解成了多个库,容易出现源代码的管理问题。
  • 应用程序数据共享,通过跨进程共享通用类的元数据,减少空间占用及启动时长。

 

  • 线程本地握手,不执行全局 VM 安全点也能对线程执行回调,同时实现单线程停止回调。
  • JDK 1.10提供了一组默认证书,开源 Java SE CA程序,对开发人员更具吸引力。

JDK 12.0

JDK 12.02019319日发布

  • 引入JVM常量API
  • 扩展了switch语句
  • 支持Unicode 11.0
  • 为日本Reiwa Era提供了方形字符支持
  • NumberFormat增加了对以紧凑格式格式化数字的支持

JDK 13.0

JDK 13.02019917日发布

  • 350 Dynamic CDS Archives(动态CDS档案)

允许在Java应用程序执行结束时动态归档类。归档的类将包括默认基层CDS归档中不存在的所有已加载应用程序类和库类。

  • 351 ZGC: Uncommit Unused MemoryZGC:取消提交未使用的内存)

将未使用的堆内存还给系统(即未提交的内存空间)

  • 353 Reimplement the Legacy Socket API(重新实现旧版套接字API
  • 354 Switch Expressions Switch表达式)

主要是对switch表达式进行扩展,支持原有的case方式和新的case方式。新的case语句更加精炼简洁。
使用yield语句返回值,放弃了break语句。

java13中的语法格式(提倡"case L ->"语法格式,提倡常量中用逗号隔开):

switch (day) {

    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);

    case TUESDAY                -> System.out.println(7);

    case THURSDAY, SATURDAY     -> System.out.println(8);

   case WEDNESDAY              -> System.out.println(9);

}

 

  • 355 Text Blocks(文字块)

将文本块添加至java语言,多行字符串不需要转义,提高代码的可读性

 

 

JDK 14.0

JDK 14.02020317日发布

  • 305Pattern Matching for instanceof (Preview)

instanceof 运算符引入模式匹配(预览阶段)

通过模式匹配,开发者可以用更简洁和更安全的方式来表达通用的程序逻辑。instanceof 运算符的模式匹配支持从对象中按条件来提取组件,此语言特性目前处于预览阶段。

  • 343:Packaging Tool (Incubator)

打包工具(孵化阶段)

创建一个用于打包独立 Java 应用程序的工具。

  • 345NUMA-Aware Memory Allocation for G1

针对 G1 NUMA-Aware 内存分配

通过实现 NUMA-aware 内存分配,提升 G1 在大型机器上的性能。

  • 349JFR Event Streaming

JFR 事件流

暴露 JDK Flight Recorder 数据以进行连续监视。

  • 352Non-Volatile Mapped Byte Buffers

非易失性映射的字节缓冲

非易失性映射的字节缓冲将添加新的 JDK 特定文件映射模式,该模式允许 FileChannel API 用于创建引用非易失性内存(NVM)的 MappedByteBuffer 实例。

  • 358Helpful NullPointerExceptions

改进 NullPointerExceptions,通过准确描述哪些变量为 null 来提高 JVM 生成的异常的可用性。该提案的作者希望为开发人员和支持人员提供有关程序为何异常终止的有用信息,并通过更清楚地将动态异常与静态程序代码相关联来提高对程序的理解。

  • 359Records (Preview)

Records 提供了一种紧凑的语法来声明类,以帮助开发者写出更简洁的代码,这些类是浅层不可变数据(shallowly immutable data)的透明拥有者。该特性主要用在特定领域的类,这些类主要用于保存数据,不提供领域行为。

  • 361Switch Expressions (Standard)

Switch Expressions JDK 12 13 中都是预览状态,现在在 JDK 14 中已成为稳定特性。switch 表达式扩展了 switch 语句,使其不仅可以作为语句(statement),还可以作为表达式(expression),并且两种写法都可以使用传统的 switch 语法,或者使用简化的“case L ->”模式匹配语法作用于不同范围并控制执行流。这些更改将简化日常编码工作,并为 switch 中的模式匹配做好准备。

  • 362Deprecate the Solaris and SPARC Ports

弃用 Solaris SPARC 端口

弃用 Solaris/SPARC, Solaris/x64 Linux/SPARC 端口,以便在未来的版本进行移除。

  • 363Remove the Concurrent Mark Sweep (CMS) Garbage Collector

移除 CMS(Concurrent Mark-Sweep) 垃圾回收器。

  • 364ZGC on macOS

ZGC 垃圾回收器移植到 macOS

  • 365ZGC on Windows

ZGC 垃圾回收器移植到 Windows

  • 366Deprecate the ParallelScavenge + SerialOld GC Combination

弃用 ParallelScavenge + SerialOld GC 的垃圾回收算法组合。

  • 367Remove the Pack200 Tools and API

移除 Pack200 工具和 API

删除 java.util.jar 包中的 pack200 unpack200 工具以及 Pack200 API

  • 368Text Blocks (Second Preview)

文本块特性(Text Blocks)与常见的 Python"any input"特性一样,它支持多行字符串文字,可以不需要使用大多数转义序列,并以一种可预测的方式自动设置字符串格式,同时可以让开发人员控制格式。虽然这不是特别复杂的特性,但对于开发中想将 HTML 代码引入 Java 来说是极大的便利,代码可读性也极大提高。目前处于第二个预览阶段。

  • 370Foreign-Memory Access API (Incubator)

外部内存访问 API(孵化阶段)

新增一个 API 以允许 Java 程序安全有效地访问 Java 堆之外的外部内存。

 

已整理成pdf文档需要的点下面链接免费下载或者添加公众号获取:

java技术体系与JDK发展史

 

推荐一个技术性公众号:

Java技术体系与JDK发展史,你知道嘛?_第1张图片 闲来无事聊聊技术

 

你可能感兴趣的:(技术分享)