Java虚拟机--Java发展史Java虚拟机

Java虚拟机

从今开始,笔者开始向大家讲解JAVA虚拟机的知识,有没有很兴奋!!!!

对于JAVA开发者来说,虚拟机再熟悉不过,每天的工作中都会接触,但是总有一种“近在眼前,却又远在天边”的感觉。

而笔者要写的这一系列文章,就是想帮助大家去除这样的困惑,让大家明白虚拟机是什么,做了哪些事情,哪些机制跟我们的开发息息相关。

既然学习虚拟机,那么关于Java的相关历史还是有必要去了解的,在本章节中,笔者将会先介绍Java的发展历史,再说说Java虚拟机的发展历史!

接下里,就让我们开始第一章节的学习吧。

Java发展史

Java编程语言从诞生到现在已经二十年多年,现已发展成为计算机史上影响深远的编程语言之一,开源/跨平台是其最大的特征,也正是因为此,Java不断地吸引世界上众多优秀程序员来进行学习。

Java从第一个版本的诞生,到现在已经有20多年的时间了。经过这20多年的发展,以及数次的迭代,Java现在发展到了第九个版本--JDK1.9。相比于最早的JDK1.0来说,现在的Java已经成为了世界上最受欢迎的编程语言之一,并且还是使用者最多的编程语言。想必,在20多年前,谁也无法预想到如今的场景。

image

说起Java的发展史,就不得被提及“Java之父”---詹姆斯·高斯林(James Gosling),他于1955年5月19日出生在加拿大,Java编程语言创始人之一。

早在20世纪90年代初,大概在1990年,硬件领域开始出现了单片式计算机系统,低廉的价格以及在当时高度化的智能,使其一出现便吸引了市场的注意(在现在看来,当时的智能程度就跟过家家一样)。

为了抢占单片机市场的先机,Sun公司在1991年成立了绿色计划(Green project)项目组,此计划的目的是开发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序架构,由“Java之父”詹姆斯·高斯林领导。可惜好景不长,经过一年多的开发,项目并没有得到市场的认同,但是在开发的过程中,诞生了一个名叫作Oak(橡树)的面向对象语言。正所谓“有心栽花花不开,无心插柳柳成荫”,Oak(橡树)为后续Java的诞生起到了至关重要的作用。

在项目的进展过程中,由于C++所具有的优势,绿色计划(Green project)的开发人员首先考虑采用C++来编写程序,但对于硬件资源极其匮乏的单片式系统来说,C++程序过于复杂和庞大,操作起来困难太大,所以项目组决定根据嵌入式软件的要求,对C++进行了改造,去除了留在C++的一些不太实用及影响安全的成分,开发了一种称为Oak的面向对象语言,这就是Java语言的前身

1992年夏天,绿色计划(Green project)已经完成了大部分功能,包括Green操作系统,Oak的程序设计语言、类库等。同年11月,绿色计划(Green project)被独立成为了一个叫做“FirstPerson有限公司”,一个sun公司的全资子公司,并试图从时代华纳获得一个电视机顶盒交互系统的订单,不过在当时市场不成熟的情况下,项目没有获得成功。

直至1994年下半年,由于Internet的迅猛发展和环球信息网WWW的快速增长,第一个全球信息网络浏览器Mosaic诞生了,Oak也随着这波浪潮得到了迅速的发展。

image

詹姆斯·高斯林(James Gosling)意识到,这是一个机会,于是决定改变绿色计划的发展方向,对Oak进行了小规模的改造,并完成了Oak语言编写的网页浏览器:WebRunner。直到1995年5月23日,在SunWorld大会上正式发布Java 1.0版本,至此Java语言诞生了,并首次提出了“Write Once,Run Anywhere”(一次编译,到处运行)的口号。

在1995年Sun虽然推出了Java,但这只是一种语言,而要想开发复杂的应用程序,必须要有一个的强大的开发库支持还行。因此,Sun在1996 年1月23日发布了JDK1.0,提供了一个纯解释执行的Java虚拟机实现(Sun Classic VM)。这个版本包括了两部分:运行环境(即JRE)和开发环境(即JDK),至今依旧沿用。在JDK1.0版本中,主要技术包括:Java虚拟机、AWT等。

在推出Java1.0版本后,Sun公司在1997年2月19日,Sun公司发布了Java1.1版本,相比于1.0版本,1.1版本最大的改进就是增加了JIT(即时编译器),JIT和传统的编译器不同,传统的编译器是编译一条,运行完后再将其扔掉,而JIT会将经常编译的指令保存在内存中,在下次调用时就不需要再编译了,这样在效率上有了非常较大大的提升。此外,Java技术的一些最基础的支撑点也都是在Java1.1版本中发布的,例如:JAR文件格式、JDBC、JavaBeans、RMI、内部类(Inner Class)、反射(Reflection)。

往后的几年中,Java陆续更新迭代版本,JDK 1.1大版本中一共发布了1.1.0~1.1.8九个小版本。从1.1.4之后,每个JDK版本都有一个自己的名字(工程代号),分别为:JDK 1.1.4 - Sparkler(宝石)、JDK 1.1.5 - Pumpkin(南瓜)、JDK 1.1.6 - Abigail(阿比盖尔,女子名)、JDK 1.1.7 - Brutus(布鲁图,古罗马政治家和将军)和JDK 1.1.8 – Chelsea(切尔西,城市名)。

时间来到了1998年12月4日,Java迎来了一个里程碑式的版本Java1.2,在此版本中Java被拆分成了3个方向,也就是我们熟知的J2SE(Java 2 Platform, Standard Edition)、J2EE(Java 2 Platform, Enterprise Edition)和J2ME(Java 2 Platform, Micro Edition)。在Java1.2这个版本中,Java虚拟机第一次内置了JIT(Just In Time)编译器,之前版本的Sun Classic VM虚拟机只能以外挂的形式使用JIT编译器。在API上,集合系列Collection出现了。

在1999年3月和7月,分别有Java1.2.1和Java1.2.2两个小版本发布。

2000年5月8日,Java1.3发布,工程代号为Kestrel(美洲红隼)。相比于1.2来说,Java1.3改进主要表现在一些类库上(如数学运算和新的Timer API等),增加了JNI的支持,这使得Java可以访问本地资源了、支持XML了。此外,在Java1.3大版本中,还有个修正版Java1.3.1,工程代号为Ladybird(瓢虫),于2001年5月17日发布。

2001年6月5日,Nokia宣布到2003年将出售1亿部支持Java的手机;

时间来到了2002年2月13日,Sun公司发布了Java历史上最为成熟的版本Java1.4,工程代号为Merlin(灰背隼)。在进入21世纪以来,在.NET平台和Java平台之间发生了一次声势浩大的孰优孰劣的论战,Java的主要问题就是性能。不过,随着Java1.4的诞生论战就此终结,Sun公司集中主要的精力来解决性能问题。值得关注的是,Java1.4还发布了很多新的特性,如正则表达式、异常链、NIO、日志类、XML解析器和XSLT转换器等。

2004年9月30日,Java1.5发布,工程代号Tiger(老虎)。在Java1.5中出现了我们熟悉的语法,例如:自动拆装箱、泛型、动态注解、枚举、可变长参数,遍历循环(foreach循环)等。在虚拟机和API层面上,这个版本改进了Java的内存模型(Java Mozilla Model,JMM)、提供了java.util.concurrent并发包等。

在2006年11月13日的JavaOne大会上,Sun公司宣布最终会将Java开源,并在随后的一年多时间内,陆续将JDK的各个部分在GPL v2(GNU General Public License v2)协议下公开了源码,并建立了OpenJDK组织对这些源码进行独立管理。

2006年12月11日,Java1.6发布,工程代号Mustang(野马)。这个版本尤其特殊,Sun公司终结了从Java1.2开始已经有8年历史的J2EE、J2SE、J2ME的命名方式,启用java SE 6、Java EE 6、Java ME 6的命名方式。在这个版本中,Java虚拟机做了大量改进,包括锁与同步、垃圾收集、类加载等。

在Java 1.6后,由于代码复杂性增加、JDK开源、以及Sun公司收购案等原因,Java再也没有维持两年发布一个主版本的发展速度,到目前为止Java1.6一共发布了37个小版本。

image

2009年2月19日,Java1.7完成了第一个里程碑版本(此时并未发布),工程代号为Dolphin(海豚),相根据最初的规划来看,Java1.7是一个包含众多改进的版本,但是由于商业和技术竞争的劣势,Sun公司在当时的市值仅为巅峰时期的3%,财务上的紧张导致Sun公司无力推动研发计划如期进行,最终2009年4月20日,Oracle公司宣布正式以74亿美元的价格收购Sun公司,Java商标从此正式归Oracle所有。

直至,2011年7月28日,Java1.7正式发布,相信现在还有不少公司的项目是运行在Java1.7之上。主要语法改进点,包括:switch语句块中允许以字符串作为分支条件、在一个语句块中捕获多种异常、引入Java NIO.2开发包、在创建泛型对象时应用类型推断等;

值得一体的是,Java1.7在第四个小版本更新时,开始支持Mac系统,并在第六个小版本时完全支持。

2014年3月19日,Java1.8正式发布,工程代号Spider(蜘蛛),主要改进包括:Lambda表达式,还有Stream API流式处理,joda-time等等一些新特性。其中,最大的改进就是Lambda表达式,主要为了使Java更易于为多核处理器编写代码。

在历经多次跳票之后,2017年9月22日,Java1.9正式发布,带来了众多特性,其中最为关注的是模块化(Project Jigsaw),该特性使Java可以适应不同大小的计算设备,改进其安全性,可维护性,提高性能,简化各种类库和大型应用的开发和维护。模块化(Project Jigsaw)从Java1.7阶段就开始筹备,Java1.8阶段进行了大量工作,终于在Java1.9里落地;

说完了,Java的发展史。接下来,我们来解释下Java中涉及到的一些概念!

Java分支

上面,我们说到了Java在1.2版本时,被拆分成了3个方向J2SE(Java 2 Platform,Standard Edition)、J2EE(Java 2 Platform, Enterprise Edition)和J2ME(Java 2 Platform,Micro Edition)。那么,这三个方向代表什么含义呢?

Java ME(Micro Edition):支持Java程序运行在移动终端(手机、PDA)上的平台,对Java API有所精简,支持早期的移动终端智能设备,这个版本以前称为J2ME。已经被淘汰了,现在开发也基本不用了。

Java SE(Standard Edition):支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API,这个版本以前称为J2SE。Java SE为Java EE和Java ME提供了基础。

Java EE(Enterprise Edition):支持使用多层架构的企业应用(如ERP、CRM应用)的Java平台,除了提供Java SE API外,还对其做了大量的扩充并提供了相关的部署支持,这个版本以前称为J2EE。

说的直白点,Java ME已被淘汰,无需了解;Java SE就是我们刚开始学习Java所接触到的版本,包含了集合、数组、IO等基础知识,包含了Java的核心API;Java EE就是我们开发后台程序用到的版本,包含常spring、servlet、jdbc、springboot等,主要适用于创建服务器应用程序;

Java环境

说到Java的环境,那么就得来解释下JDK和JRE了!

简单的说,JDK是用于支持Java程序开发的最小环境;而JRE,则是支持Java程序运行的最小环境。所以很明显,JRE是JDK的子集;

image

可以看出,JRE作为运行最小环境,只需要虚拟机和JavaSE API,即可将字节码运行起来;

而JDK作为开发最小环境,则需要向javac之类的工具,来进行代码编译等操作,另外还包括一些Java程序监控的工具Java VisualVM, JConsole等。

也就是说JRE只能负责运行,JDK则全活!!!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

漏洞多到修不完!甲骨文计划取消Java序列化功能

甲骨文 Java 平台组的首席架构师 Mark Reinhold 指出,甲骨文计划取消 Java 语言主体中的数据序列化/反序列化支持。

10810
来自专栏闰土大叔

太原面经分享:如何在vue面试环节,展示你晋级阿里P6+的技术功底?

一年一度紧张刺激的高考开始了,与此同时,我也没闲着,奔走在各大公司的前端面试环节,不断积累着经验,一路升级打怪。

22710
来自专栏程序员互动联盟

八招让你成为C/C++的编程大牛

这个题目的噱头太大,要真的写起来, 足够写一本书了。 本人是过来人, 结合自身的体会和大家交流一下,希望新人能少走弯路。 每个人的情况不一样,我下面的描述可能并...

41760
来自专栏程序人生 阅读快乐

Linux Shell编程与编辑器使用详解

本书由浅入深,全面、系统地介绍了Linux技术,书中提供了大量实例,供读者实战演练。另外,本书有很多关于Linux下的命令操作内容,所以对于每个命令、每个管理设...

12510
来自专栏phodal

如何识别不同的编程语言(上)

漫谈编程语言:数量 这又是一个有趣的话题~~,要知道编程语言有那么的多。引自Quora上一个相关问题的答案,从ABC到Z Shell就有256个。 但是这并不是...

45260
来自专栏Android知识点总结

01--Java核心之JVM引入篇

虚拟机即:虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的 JVM只是一种用于计算设备的规范,广义来说相当于一个接口,而接口的实现可以不...

9730
来自专栏Java社区

前端小白入门系列课程教程视频

19830
来自专栏CDA数据分析师

一个初级python web后端开发工程师的面试总结

原文链接:https://blog.csdn.net/ayocross/article/details/56509840

19630
来自专栏屈定‘s Blog

面经

从2016.7来到上海后记录下自己的面试经历,希望能对其他人有所帮助,同时给自己一个提醒.

14540
来自专栏博岩Java大讲堂

Java虚拟机--虚拟机发展史

38150

扫码关注云+社区

领取腾讯云代金券