Skip to content

Java发展史

字数
3629 字
阅读时间
14 分钟

一、Java起源

1. 起源背景

Java最初由James Gosling和他的团队在Sun Microsystems公司于1991年发明,主要目的是设计一种适用于消费电子产品的软件平台,具有跨平台能力、简单易用。当时,消费电子产品市场正在快速发展,但各品牌设备之间的兼容性问题严重,Sun Microsystems公司决定启动一个代号为“Green Project”的项目,目标是开发一种能够在各种消费电子设备上运行的软件平台。

最初,Gosling给这门新语言取名为“Oak”,这是因为他办公室外有一棵橡树(Oak Tree)。然而,由于“Oak”这个名字已经被注册为商标,他们不得不另选新名。

James Gosling 回忆说,“Java”是一个叫 Mark Opperman 的人提议的,他是在一家咖啡店得到灵感的。奇妙的是,“Java”这个单词也是印度尼西亚爪哇岛的英文名,因生产咖啡而闻名,巧不巧?

使用十六进制编辑器打开由 Java 源代码编译出的二进制文件(.class 文件,后面会详细介绍,先不着急),就可以看得到,最前面的 8 个字符是 CA FE BA BE(定义文件类型的魔数),即词组“CAFE BABE”(咖啡屋宝贝)。

1995年5月23日,Java语言正式发布,并首次引入了“Write Once, Run Anywhere”(WORA)的理念。

二、Java发展简史

20 世纪 90 年代,单片式计算机系统诞生。单片式计算机系统不仅廉价(之前的计算机非常庞大,并且昂贵),而且功能强大,可以大幅度提升消费性电子产品的智能化程度。

Sun 公司为了抢占市场先机,在 1991 年成立了一个由詹姆斯·高斯林(James Gosling)领导的,名为“Green”的项目组,目的是开发一种能够在各种消费性电子产品上运行的程序架构。

项目组首先考虑的是采用 C++ 来编写程序,但 C++ 过于复杂和庞大,再加上消费电子产品所采用的嵌入式处理器芯片的种类繁杂,需要让编写的程序能够跨平台运行并不容易——C++ 在跨平台方面做得并不好。

思前想后,项目组最后决定:在 C++ 的基础上创建一种新的编程语言,既能够剔除 C++ 复杂的指针和内存管理,还能够兼容各种设备。这语言最初的名字叫做 Greentalk,文件扩展名为 .gt。这个名字叫的比较随意,就因为项目组叫 Green,没什么特殊的寓意。

Oak 是“Java”的第二个名字,这次就有点意义了。Oak(橡树)是力量的象征,被美国、法国、德国等许多欧美国家选为国树。

1992 年,Oak 的雏形有了,但项目组在向硬件生产商进行商演的时候,并没有获得认可,于是 Oak 就被搁置一旁了。

1994 年,项目组发现 Java 更适合进行 Internet 编程。随后,项目组用 Oak 语言研发了一种能将小程序嵌入到网页中执行的技术——Applet。Applet 不仅能嵌入网页,还能够随同网页在网络上进行传输。

1995 年,Oak 被重新命名为“Java”,因为 Oak 被别的公司注册过了。新的名字最好能够表达出技术的本质:dynamic(动态的)、revolutionary(革命性的)、Silk(像丝绸一样柔软的)、Cool(炫酷的)等等。另外,名字一定要容易拼写,念起来也比较有趣。

“Java”是印度尼西亚爪哇岛的英文名,因生产咖啡而闻名,所以,小伙伴也看到了,Java 这个单词经常和一杯冒着热气的咖啡一起出现。

同年,Sun 公司在 SunWorld 大会上正式发布了 Java 1.0 版本,第一次提出了“Write Once, Run anywhere”的口号。《时代》杂志将 Java 评为 1995 年十大最佳产品之一。

1996 年 1 月 23 日,JDK 1.0 发布,Java 语言有了第一个正式版本的运行环境。JDK 1.0 是一个纯解释执行的 Java 虚拟机,代表技术有:Java 虚拟机、AWT(图形化界面)、Applet。

4 月,十个主要的操作系统和计算机供应商宣称将在产品中嵌入 Java 技术。9 月,已有大约 8.3 万网页应用采用了 Java 来制作。5 月底,第一届 JavaOne 大会在旧金山举行,从此,JavaOne 成为全世界数百万 Java 语言开发者的技术盛会。

1997 年 2 月 19 日,JDK 1.1 发布,代表技术有:JAR 文件格式、JDBC、JavaBeans、RMI(远程方法调用)。

1998 年 12 月 4 日,JDK 1.2 发布,这是一个里程碑式的版本。Sun 在这个版本中把 Java 拆分为三个方向:面向桌面开发的 J2SE、面向企业开发的 J2EE,面向移动开发的 J2ME。代表技术有:EJB、Swing。

2000 年 5 月 8 日,JDK 1.3 发布,对 Java 2D 做了大幅修改。

2002 年 2 月 13 日,JDK 1.4 发布,这是 Java 真正走向成熟的一个版本,IBM、富士通(二哥曾在这家世界 500 强的日企工作过三年半时间)等著名公司都有参与。代表技术有:正则表达式、NIO。

2004 年 9 月 30 日,JDK 5 发布,注意 Sun 把“1.x”的命名方式抛弃了。JDK 5 在 Java 语法的易用性上做出了非常大的改进,比如说:自动装箱、泛型、动态注解、枚举、可变参数、foreach 循环。

2006 年 12 月 11 日,JDK 6 发布,J2SE 变成了 Java SE 6,J2EE 变成了 Java EE 6,J2ME 变成了 Java ME 6。JDK 6 恐怕是 Java 历史上使用寿命最长的一个版本了。主要的原因有:代码复杂性的增加、世界经济危机、Oracle 对 Sun 的收购。

JDK 6 的最后一个升级补丁为 Java SE 6 Update 211, 于 2018 年 10 月 18 日发布。

2009 年 2 月 19 日,JDK 7 发布,但功能是阉割的。很多翘首以盼的功能都没有完成,比如说 Lambda 表达式。主要是因为 Sun 公司在商业上陷入了泥沼,已经无力推动 JDK 7 的研发工作。

2009 年 4 月 20 日,Oracle 以 74 亿美元的价格收购了市值曾超过 2000 亿美元的 Sun 公司——太阳终究还是落山了。对于 Java 语言这个孩子来说,可以说是好事,也可以说是坏事。好事是 Oracle 有钱,能够注入资金推动 Java 的发展;坏处就是 Oracle 是后爸,对 Java 肯定没有 Sun 那么亲,走的是极具商业化的道路。

2014 年 3 月 18 日,JDK 8 发布。

2017 年 9 月 21 日,JDK 9 发布。从此以后,JDK 更新版本的速度令开发者应接不暇,半年一个版本,虽然 Oracle 的目的是好的,为了避免因功能增加而引发的跳票风险,但不得不承认,版本更新的节奏实在是有点过于频繁。

这就导致一个问题,好不容易更新一个版本,用了六个月后,Oracle 不维护了。针对这个问题,Oracle 给出的解决方案挺奇葩的,每六个 JDK 大版本才会被长期支持(Long Term Support,LTS)。

JDK 8 是 LTS 版,2018 年 9 月 25 日发布的 JDK 11 是 LTS 版, 2018 年 3 月 20 日发布的 JDK 10 就可以一笔带过了。

2021 年发布的 JDK 17 是目前最新的 LTS 版本。

三、Java特性

Java跨平台性

开发者在不同平台上开发程序,曾经深受平台依赖性之苦,像C/C++等语言,编写的程序需要根据不同的操作系统和硬件平台进行手动适配,耗费大量时间精力。Java的出现宛如救星,凭借跨平台性,在程序开发领域掀起巨大变革。

当开发一个项目时,团队成员使用的电脑配置各异,有的是Windows系统,有的是Mac系统。如果用C/C++开发,就需要针对不同系统编译不同版本,不仅复杂,而且极易混淆。而Java就像一个通用的桥梁,开发人员只需将Java源代码(.java文件)通过Java编译器(javac)编译成Java字节码(.class文件),这字节码不针对特定硬件或操作系统,是一种抽象的机器指令,之后无论是在Windows、Linux还是Mac OS操作系统上,只要安装了对应的Java虚拟机(JVM)实现,程序就能流畅运行。JVM好比一个全能翻译官,它根据操作系统特性,将字节码精准翻译成相应的机器码,实现不同平台的无缝对接。这样我们就可以在不同平台上专注于业务逻辑开发,无需为适配各种环境分散精力,极大提升开发效率,降低维护成本。

例如,开发企业级应用时,前端开发人员可在Mac上高效设计界面,后端开发人员用Windows完成逻辑编写,测试人员在各类系统环境下全面测试,随后将程序部署到运行Linux的服务器上。整个过程中,无需针对不同平台修改代码,编译一次,到处运行,真正实现“Write Once, Run Anywhere”。

垃圾回收(Garbage Collection,GC)

在开发过程中,内存管理是至关重要且极易出错的环节。此前,如C/C++这般语言,将内存分配与回收全权交给开发者,这要求开发者对内存管理有深入了解,稍有不慎,就会导致内存泄漏、非法内存访问等严重问题。

以开发一个大型游戏为例,游戏中有大量角色、场景、道具等对象,频繁创建与销毁,若手动管理内存,不仅要时刻跟踪每个对象的生命周期,还要准确判断何时释放内存,这不仅大大增加代码量,还容易因疏忽引发程序崩溃。

Java引入垃圾回收机制,解决了这一难题。在Java程序运行时,所有对象都存储于Java堆(Heap)中,JVM负责堆中对象的内存分配。垃圾回收器通过引用追踪(Reference Tracking)确定对象的活动状态。开发过程中,我们创建大量对象,随后部分对象不再被引用,变成垃圾。此时,垃圾回收器定期扫描堆中的对象,标记所有可以访问到的对象,接着清除未被标记的对象,回收其占用的内存。通常,这一过程分为标记阶段(Marking)与清除阶段(Sweeping)。同时还对回收后内存进行合理分配与空间整理,减少内存碎片,确保后续对象能分配到合适连续内存块,避免频繁寻找可用内存导致的性能损耗。

以电商网站开发为例,用户浏览商品时会创建购物车、商品详情等对象,下单后这些对象不再被引用,垃圾回收器自动清理,释放内存,供新对象使用。这不仅减轻开发者负担,让他们能更专注业务逻辑开发,如优化购物车算法、提升支付流程安全性,还提升代码稳定性与健壮性,降低因内存管理问题引发的程序崩溃风险。

JIT(Just-in-Time Compilation)

在开发早期版本Java程序时,大家很快发现纯解释执行的性能瓶颈。比如开发一个计算密集型的科学计算应用,像对大量气象数据进行复杂模型计算,程序运行速度慢如蜗牛。每次执行字节码都需要JVM解释,性能远远达不到实际应用要求。

于是,Java引入JIT(Just-in-Time Compilation)技术,为性能优化开辟全新路径。运行程序时,JVM先加载class文件,并以解释方式执行字节码,这种方式确保跨平台特性。但JIT编译器同时登场,它实时监测程序运行,识别热点代码,这些热点代码往往是程序的核心业务逻辑,频繁执行,如电商系统中订单处理、支付环节相关代码。JIT编译器识别出后,立即将热点字节码在后台编译成本地机器码,编译完成的机器码存储于JVM内存,供后续重复快速执行。此外,JIT编译器对机器码进行优化,如循环展开、公共子表达式消除等,进一步提升执行效率。JVM还会缓存优化后的机器码,下次遇到相同热点代码,直接使用缓存代码,无需重新编译。

以开发视频编码软件为例,软件运行中存在大量图像处理热点代码,JIT编译器将其编译优化,大幅提升视频编码速度,从可能的数小时缩短至几十分钟,显著提高视频编码效率,使Java程序性能与本地编译的C或C++程序相媲美。

贡献者

文件历史