【扫盲】Java技术体系和Java虚拟机的发展历程

说到Java,我们并不陌生,它不仅是一门面向对象的编程语言,还是一个由一系列计算机软件和规范组成的技术体系,该技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统,移动终端,企业服务器,大型机等多种场合,迄今为止拥有着全世界最大的软件开发团队,在编程语言的排行榜有着不可动摇的地位和热度。目前,世界主流三大商用虚拟机有Oracle的HotSpot、BEA的JRockit、IBM的J9,得益于Sun/OracleJDK在Java应用中的统治地位,HotSpot虚拟机理所当然的成为了全世界使用最广泛的Java虚拟机,是虚拟机家族中毫无争议的老大。

本文重点梳理下Java技术体系中的一些基本概念,及HotSpot虚拟机的发展历程,这里想出了以下几个方面,希望理清之前脑海里模糊的概念,算是一种扫盲吧。

  • Java技术体系有哪些构成;
  • JDK、JRE、JVM三者的区别和联系、OpenJDK和OracleJDK区别;
  • Java产品线及现状,Sun时期和Oracle时期的Java技术状况;
  • HotSpot虚拟机的发展历程。

1、Java技术体系

这里参考JCP官方(JCP:Java Community Process,即由业界多家技术巨头组成的社区组织,用于定义和发展Java的技术规范,也就是我们说的“Java社区”)给出的定义中几个组成部分:Java编程语言,各个硬件平台上的JVM实现,Class文件格式,Java类库API,第三方Java类库等等,下图可以清晰的说明:

这里把Java语言、Java类库、Java虚拟机这三部分称为JDK(Java Development kit),把Java类库API中的Java SE API 和Java虚拟机称为JRE(Java Runtime Environment)。因此,JDK、JRE、JVM三者的包含关系也就很清晰了,JDK用于支持Java程序开发的最小环境,而JRE则是支持Java程序运行的标准环境,通常我们会用JDK来代指Java技术体系,比如JDK 8、OpenJDK、OracleJDK等。

OpenJDK,顾名思义指的是开源的JDK,是Sun公司在2006年年末的JavaOne大会上首次提出的对Java源码进行开源的计划,除了极少量的产权代码不同外,几乎可以把OpenJDK当做SunJDK,而SunJDK最终因被Oracle收购也不复存在了,至于后来的OracleJDK、Oracle OpenJDK则是从OpenJDK源码衍生出的发行版。因为那段收购的历史,OpenJDK内部的版本在之后的一段时间内也存在不同的差异,Oracle通过建立不同分支推进着JDK版本的更新,最终在JDK 11时OpenJDK和OracleJDK的代码才达到完全达到一致的程度。

按照Java技术服务的领域划分的话,Java技术体系又可以分为四个部分: 

  1. Java Card:支持Java小程序运行在小内存设备上的平台。
  2. Java Micro Edition:Java ME,支持Java程序运行在移动终端上的平台,对于Java API有所精简,并加入了移动终端的针对性支持, 注意几点 —— JDK 6之前Java ME称为J2ME;安卓不属于Java ME。
  3. Java Standard Edition:Java SE,支持面向桌面级应用(如windows下的应用程序)的Java平台,提供了完整的Java核心API。注意 —— JDK 6之前Java SE称为J2SE。
  4. Java Enterprise Edition:Java EE,支持使用多层架构的企业级应用(如ERP、CRM等应用)的Java平台,除了提供 Java SE API外,还对其做了大量有针对性的扩展(一般为javax.*的包名),并提供了相关的部署支持。 注意 —— JDK 6之前被称为J2EE,JDK 10之后Oracle放弃了Java EE并将其捐献给了Eclipse基金会管理,改名为Jakarta EE。

2、Java技术发展历程

作为了Java发展历史简单了解一下,重点关注下JDK版本带来的变化,Java技术的发展可以大致分为两个阶段,即Sun时期,Oracle时期

Sun时期的Java技术发展历程:

  • 1991年4月,作为一种能在各种消费性电子产品上运行的程序架构,Oak语言由James Gosling博士领导被开发出来。
  • 1995年互联网潮流兴起,使得名不见经传的Oak迅速找到了适合自己的市场定位,并与同年5月23日更名为Java,发布了Java 1.0版本,第一次提出了“一次编译,处处运行”的口号。
  • 1996年1月23日,JDK 1.0作为Java语言第一个正式版本的运行环境发布,它提供了一个纯解释执行的JVM实现(Sun Classic),JDK 1.0技术有:JVM,AWT,Applet。
  • 1996年4月到9月,不少的产品开始使用Java技术,大约8.3万个网页应用了Java技术来制作。
  • 1996年5月底,Sun公司于美国旧金山举行了首届JavaOne大会,从此JavaOne成为全世界数百万Java语言开发者每年一度的技术盛会。
  • 1997年2月19日,JDK 1.0发布,技术代表有:JAR文件格式、JDBC、JavaBeans、RMI等,Java语言的语法也有了一定的增强,如内部类(InnerClass)和反射(Reflection)。
  • 1998年12月4日,JDK迎来了一个里程碑式的重要版本:工程代号为Playground(竞技场)的JDK1.2,Sun在这个版本中把Java技术体系拆分为三个方向,分别是面向桌面应用开发的J2SE(Java2Platform,Standard Edition)、面向企业级开发的J2EE(Java2Platform,Enterprise Edition)和面向手机等移动终端开发的J2ME(Java2Platform,Micro Edition)。
  • 1999年3月和7月,分别有JDK1.2.1和JDK1.2.2两个小升级版本发布。
  • 1999年4月27日,HotSpot虚拟机诞生。它最初由一家名为“LongviewTechno-logies”的小公司开发,由于HotSpot的优异表现,在1997年被Sun公司收购。HotSpot虚拟机刚发布时是作为JDK1.2的附加程序提供的,后来它成为JDK1.3及之后所有JDK版本的默认Java虚拟机。
  • 2000年5月8日,工程代号为Kestrel(美洲红隼)的JDK1.3发布,数学运算和新的TimerAPI、JNDI服务、RMI的通信协议等等。自从JDK1.3开始,Sun公司维持着稳定的研发节奏:大约每隔两年发布一个JDK的主版本,以动物命名,期间发布的各个修正版本则以昆虫作为工程代号。

  • 2002年2月13日,工程代号为Merlin(灰背隼)的JDK1.4发布,它标志着Java真正走向成熟的一个版本,Compaq、Fujitsu、SAS、Symbian、IBM等著名公司都有参与功能规划,甚至实现自己独立发行的JDK1.4。JDK1.4带来了很多新的技术特性,如正则表达式、异常链、NIO、日志类、XML解析器和XSLT转换器等等。
  • 2002年前后,微软的.NETFramework发布。这个无论是技术实现还是目标用户上都与Java有很多相近之处的技术平台给Java带来了很多讨论、比较与竞争,.NET平台和Java平台之间声势浩大的孰优孰劣的论战到今天为止都仍然没有完全平息。
  • 2004年9月30日,工程代号为Tiger(老虎)的JDK5发布,Sun公司从这个版本开始放弃了谦逊的“JDK1.x”的命名方式,将产品版本号修改成了“JDKx”。JDK 5在Java语法易用性上做出了非常大的改进,如:自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach循环)等;在虚拟机和API层面,改进了Java的内存模型(Java Memory Model,JMM)、提供了java.util.concurrent并发包等。
  • 2006年12月11日,工程代号为Mustang(野马)的JDK6发布,Sun公司终结了从JDK1.2开始已经有八年历史的J2EE、J2SE、J2ME的产品线命名方式,启用JavaEE6、JavaSE6、JavaME6的新命名来代替。JDK6的改进包括:提供初步的动态语言支持(通过内置Mozilla Java Script Rhino引擎实现)、提供编译期注解处理器和微型HTTP服务器API,等等。同时,这个版本对Java虚拟机内部做了大量改进,包括锁与同步、垃圾收集、类加载等方面的实现都有相当多的改动。
  • 2006年11月13日的JavaOne大会上,Sun公司宣布计划要把Java开源,在随后的一年多时间内,它陆续地将JDK的各个部分在GPLv2协议下公开了源码,并建立了OpenJDK组织对这些源码进行独立管理,除了极少量的产权代码,OpenJDK几乎拥有了当时SunJDK7的全部代码,后来的OpenJDK7与SunJDK7本质上就是同一套代码库出来的产品。
  • JDK6发布以后,由于代码复杂性的增加、Java开源、开发JavaFX、世界经济危机及Oracle对Sun的收购案等原因,Sun公司在发展Java以外的事情上耗费了太多精力和资源,JDK的更新没有能够继续维持两年发布一个主版本的研发速度,这导致了JDK6的生命周期异常的长,一共发布了211个更新升级补丁,最后的版本为JavaSE6 Update 211,于2018年10月18日发布。
  • 2009年2月19日,工程代号为Dolphin(海豚)的JDK7完成了其第一个里程碑版本。按照JDK7最初的功能规划,一共会设置十个里程碑。最后一个里程碑版本原计划定于2010年9月9日结束,但由于各种原因,JDK7最终无法按计划完成,令人惋惜的是,在JDK7开发期间,Sun公司相继在技术竞争和商业竞争中陷入泥潭,公司的股票市值跌至仅有高峰时期的3%,已无力推动JDK7的研发工作按计划继续进行。为了尽快结束JDK7长期跳票的问题,Oracle收购Sun公司后随即宣布马上实行“B计划”,大幅裁剪了JDK7预定目标,以保证JDK7的正式版能够于2011年7月28日准时发布。“B计划”的主要措施是把不能按时完成的Lambda项目、Jigsaw项目和Coin项目的部分改进延迟到JDK8之中。最终,JDK7包含的改进有:提供新的G1收集器(G1在发布时依然处于Experimental状态,直至2012年4月的Update4中才正式商用)、加强对非Java语言的调用支持(JSR-292,这项特性在到JDK11还有改动)、可并行的类加载架构等。

Oracle时期的Java技术发展历程:

  • 2009年4月20日,Oracle宣布正式以74亿美元的价格收购市值曾超过2000亿美元的Sun公司,传奇的Sun Micro systems从此落幕成为历史,Java商标正式划归Oracle所有(Java语言本身并不属于哪间公司所有,它由JCP组织进行管理,尽管在JCP中Sun及后来的Oracle的话语权很大)。由于此前Oracle已经收购了另外一家大型的中间件企业BEA公司,当完成对Sun公司的收购之后,Oracle分别从BEA和Sun手中取得了世界三大商用虚拟机的其中两个:JRockit和HotSpot。当时Oracle宣布要在未来一至两年的时间内,把这两个优秀的Java虚拟机合二为一。两者合并的结果只能说差强人意,JRockit的监控工具Java Mission Control被移植到了HotSpot,作为收费功能提供给购买了JavaSE Advanced产品计划的用户,其他功能由于两者架构的差异性明显,HotSpot能够直接借鉴融合的功能寥寥无几
  • Oracle公司接手了JDK开发工作以后,迅速展现出了完全不同于Sun时期的、极具商业化的处事风格。面对Java中使用最广泛而又一直免费的JavaSE产品线,Oracle很快定义了一套新的JavaSE Support产品计划,把JDK的更新支持作为一项商业服务。JDK7发布的前80个更新仍然免费面向所有用户提供,但后续的其他更新包,用户只能从“将JavaSE升级到JavaSE Support”与“将JDK7升级到最新版本”两个选项里挑一个。JDK7计划维护至2022年,迄今(面向付费用户)已发布了超过两百个更新补丁,最新版本为JDK7 Update 221。
  • JDK8的第一个正式版本原定于2013年9月发布,最终还是跳票到了2014年3月18日,尽管仍然是没有赶上正点,但比起JDK7那种以年作为计时单位、直接把公司跳崩的研发状况已是大有改善。为了保证日后JDK研发能更顺利地进行,从JDK8开始,Oracle启用JEP(JDK Enhancement Proposals)来定义和管理纳入新版JDK发布范围的功能特性。JDK8提供了那些曾在JDK7中规划过,但最终未能在JDK7中完成的功能,主要包括:支持Lambda表达式、支持内置Nashorn JavaScript引擎、新的时间和日期API、彻底移除HotSpot的永久代等。
  • 原本JDK9是计划在2016年发布的,但在2016年伊始,Oracle就宣布JDK9肯定要延期至2017年,后来又连续经过了两次短时间的跳票,最终到2017年9月21日才得以艰难面世。后两次跳票的原因是以IBM和RedHat为首的十三家企业在JCP执行委员会上联手否决了Oracle提出的Jigsaw作为Java模块化规范进入JDK9发布范围的提案。最终,经过前后六轮投票,经历桌上桌下的斗争与妥协,Java没有分裂,JDK9总算是带着Jigsaw最终发布了,除了Jigsaw外,JDK9还增强了若干工具(JSShell、JLink、JHSDB等),整顿了HotSpot各个模块各自为战的日志系统,支持HTTP2客户单API等91个JEP。
  • JDK9发布后,Oracle随即宣布Java将会以持续交付的形式和更加敏捷的研发节奏向前推进,以后JDK将会在每年的3月和9月各发布一个大版本,目的就是为避免众多功能特性被集中捆绑到一个JDK版本上而引发交付风险。这次改革确实从根源上解决了跳票问题,但也为Java的用户和发行商带来了颇大的压力,不仅程序员感慨“Java新版本还没开始用就已经过时了”,Oracle自己对着一堆JDK版本分支也在挠头,不知道该如何维护更新,该如何提供技术支持。Oracle的解决方案是顺理成章地终结掉“每个JDK版本最少维护三年”的优良传统,从此以后,每六个JDK大版本中才会被划出一个长期支持(Long Term Support,LTS)版,只有LTS版的JDK能够获得为期三年的支持和更新,普通版的JDK就只有短短六个月的生命周期。JDK8和JDK11会是LTS版,再下一个就到2021年发布的JDK17了。
  • 2018年3月20日,JDK10如期发布,这版本的主要研发目标是内部重构,诸如统一源仓库、统一垃圾收集器接口、统一即时编译器接口(JVMCI在JDK9已经有了,这里是引入新的Graal即时编译器)等,这些都将会是对未来Java发展大有裨益的改进,但对普通用户来说JDK10的新特性就显得乏善可陈,毕竟它只包含了12个JEP,而且其中只有本地类型推断这一个编码端可见的改进。
  • 2018年3月27日,Android的Java侵权案有了最终判决,法庭裁定Google赔偿Oracle合计88亿美元,要知道2009年Oracle收购Sun也就只花了74亿,收购完成后随即就用Sun的专利把Google告上了法庭,经过Oracle法务部的几轮神操作,一场官司的赔偿让收购Sun公司等同免费。同时,Oracle把认为无法盈利也没有太多战略前景的部分会逐渐被“按计划报废”,第一刀选择把JavaEE“扫地出门”,所有权直接赠送给Eclipse基金会,唯一的条件是以后不准再使用“Java”这个商标,所以取而代之的将是JakartaEE。
  • 2018年6月Oracle解散了JavaMissionControl的开发团队,10月JavaOne2018在旧金山举行,此前没有人想过这会是最后一届JavaOne大会了,Oracle裁撤了在1996年伴随着Java一同诞生、成长的开发者年度盛会。
  • 2018年9月25日,JDK11发布,这是一个LTS版本的JDK,包含17个JEP,其中有ZGC这样的革命性的垃圾收集器出现。随着JDK11发布,Oracle同时调整了JDK的授权许可证,有Oracle从JDK11起把以前的商业特性全部开源给OpenJDK,这样OpenJDK11和OracleJDK11的代码和功能,在本质上就是完全相同的;Oracle宣布以后将会同时发行两个JDK,即OpenJDK和OracleJDK,核心差异是前者可以免费在开发、测试或生产环境中使用,但是只有半年时间的更新支持;后者个人依然可以免费使用,但若在生产环境中商用就必须付费,可以有三年时间的更新支持。如果说由此能得出“Java要收费”的结论,那是纯属标题党,最多只能说Oracle在迫使商业用户要么不断升级JDK的版本,要么就去购买商业支持。
  • 2019年2月,Oracle不愿意在旧版本上继续耗费资源,放弃了对上一个版本OpenJDK的维护,RedHat同时从Oracle手上接过OpenJDK8和OpenJDK11的管理权利和维护职责,RedHat代替Oracle成为JDK历史版本的维护者,应该有利于Java的持续稳定,但从技术发展角度来看,这并不能为Oracle领导Java社区的局面带来根本性的改变,毕竟要添加新的或实验性的功能,仅会针对Java的最新版本,而不会在旧版本上动手。
  • 2019年3月20日,JDK12发布,只包含8个JEP,其中主要有Switch表达式、Java微测试套件(JMH)等新功能,最引人注目的特性无疑是加入了由RedHat领导开发的Shen-andoah垃圾收集器。Shenandoah作为首个由非Oracle开发的垃圾收集器,其目标又与Oracle在JDK11中发布的ZGC几乎完全一致,两者天生就存在竞争。Oracle马上用实际行动抵制了这个新收集器,在JDK11发布时才说应尽可能保证OracleJDK和OpenJDK的兼容一致,转眼就在OracleJDK12里把Shenandoah的代码通过条件编译强行剔除掉,使其成为历史上唯一进入了OpenJDK发布清单,但在OracleJDK中无法使用的功能。

Oracle收购Sun是Java发展历史上一道明显的分界线,在Sun掌舵的前十几年里,Java获得巨大成功,同时也渐渐显露出来语言演进的缓慢与社区决策的老朽;而在Oracle主导Java后,引起竞争的同时也带来新的活力,Java发展的速度要显著高于Sun时代。Java的未来是继续向前、再攀高峰,还是由盛转衰、锋芒挫缩,你我拭目以待。Java面临的危机挑战前所未有的艰巨,属于Java的未来也从未如此充满想象与可能。

3、HotSpot虚拟机的发展历程

HotSpot VM是Sun/OracleJDK和OpenJDK中的默认Java虚拟机,最初并非由Sun公司所开发,而是由一家名为“Longview Technologies”的小公司设计的,Sun公司注意到这款虚拟机在即时编译等多个方面有着优秀的理念和实际成果,在1997年收购了Longview Technologies公司从而获得了HotSpot VM。得益于Sun/OracleJDK在Java应用中的统治地位,HotSpot VM理所当然地成为全世界使用最广泛的Java虚拟机。

HotSpot VM是一款基于准确式内存管理的,具有热点代码探测技术的虚拟机,热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知即时编译器以方法为单位进行编译。如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准即时编译和栈上替换编译(On-Stack Replacement,OSR)行为。通过编译器与解释器恰当地协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无须等待本地代码输出才能执行程序,即时编译的时间压力也相对减小,这样有助于引入更复杂的代码优化技术,输出质量更高的本地代码。

2006年Sun陆续将SunJDK的各个部分在GPLv2协议下开放了源码,形成了Open-JDK项目,其中当然也包括HotSpot虚拟机。HotSpot从此成为Sun/OracleJDK和OpenJDK两个实现极度接近的JDK项目的共同虚拟机。Oracle收购Sun以后,建立了HotRockit项目来把原来BEA JRockit中的优秀特性融合到HotSpot之中。到了2014年的JDK8时期,里面的HotSpot就已是两者融合的结果,HotSpot在这个过程里移除掉永久代,吸收了JRockit的Java Mission Control监控工具等功能。

HotSpot VM不同的实现适合不同的场景,例如Java HotSpot Client VM,通过减少应用程序启动时间和内存占用,在客户端环境中运行应用程序时可以获得最佳性能,通过调整该VM,可缩短应用程序启动时间和内存占用,使其特别适合客户端环境;Java HotSpot Server VM,旨在最大程度地提高服务器环境中运行的应用程序的执行速度,用于长时间运行的服务器程序,这些服务器程序需要尽可能快的运行速度,而不是快速启动时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值