1.1 Java语言、JVM和生态系统
Java 编程环境出现于 20 世纪 90 年代末,由 Java 语言和运行时组成。运行时也叫 Java 虚拟机(Java Virtual Machine,JVM)。
Java 刚出现时,这种分离方式很新奇,但最近软件开发的趋势表明,这已经变成了通用做法。值得一提的是微软的 .NET 环境,它比 Java 晚几年出现,但沿用了非常类似的平台架构方式。
微软的 .NET 平台和 Java 相比有个重要的区别,人们都觉得 Java 是相对开放的生态系统,有多个开发方。在 Java 的演进过程中,这些开发方在合作的同时也有竞争,不断推进 Java 的技术发展。
Java 成功的主要原因之一是,整个生态系统是个标准的环境。这意味着组成 Java 环境的各种技术都有规范。这些标准让开发者和客户相信,自己所用的技术能和其他组件兼容,即便来自不同的技术提供方也不怕。
Java 目前归甲骨文公司所有(甲骨文收购了发明 Java 的太阳计算机系统公司,以下简称 Sun)。红帽、IBM、惠普、SAP、苹果和富士通等公司也大量参与了 Java 标准技术的实现。
Java 也有开源版本,叫 OpenJDK,由多家公司合作开发。
其实,Java 由多个不同但相互联系的环境和规范组成,包括 Java 移动版(Java ME)、Java 标准版(Java SE)和 Java 企业版(Java EE)。本书只涵盖 Java SE 第 8 版。
后面会详细说明标准,现在先介绍 Java 语言和 JVM。这是两个不同但互有关联的概念。
1.1.1 Java语言是什么
Java 程序的源码使用 Java 语言编写。Java 是人类可读的编程语言,基于类,而且面向对象,比较易读易写(偶尔有点啰嗦)。
Java 有意识地降低了教、学成本,参考了 C++ 等语言的行业经验,尽量删除了复杂的功能,但保留了“前辈”编程语言的精粹。
总的来说,Java 的目的是为企业开发商业应用提供坚实稳定的基础。
作为一门编程语言,Java 的设计相对保守,而且改动频率低。这么做是有意保护企业对 Java 技术的投入。
Java 语言自 1996 年发布之后,一直在不断地修订(但没有完全重写)。也就是说,一开始为 Java 选择的设计方式,即 20 世纪 90 年代末采用的那些权宜之计,现在仍旧影响着这门 语言。详情参见第 2 章和第 3 章。
Java 8 的变动幅度很大,是近十年来罕见的(有些人觉得是 Java 出现以来最大的变动)。lambda 表达式的引入和核心中集合 API 的大幅度改写等,将彻底改变大多数 Java 开发者编写代码的方式。
Java 语言受 Java 语言规范(Java Language Specification,JLS)的约束,这个规范限定了某项功能必须采用某种方式实现。
1.1.2 JVM是什么
JVM 是一个程序,提供了运行 Java 程序所需的运行时环境。如果某个硬件和操作系统平台没有相应的 JVM,就不能运行 Java 程序。
幸好,JVM 被移植到了大多数设备中,机顶盒、蓝光播放器、大型机或许都有适用的 JVM。
Java 程序一般都在命令行中启动,例如:
java <arguments> <program name>
这个命令会在操作系统的一个进程中启动 JVM,提供 Java 运行时环境,然后在刚启动的(空)虚拟机中运行指定的程序。
有一点很重要,你要知道:提供给 JVM 运行的程序不是 Java 语言源码,源码必须转换(或编译)成一种称为 Java 字节码的格式。提供给 JVM 的 Java 字节码必须是类文件格式,其扩展名为 .class。
JVM 是字节码格式程序的解释器,一次只执行字节码中的一个指令。而且,你还要知道,JVM 和用户提供的程序都能派生额外的线程,所以用户提供的程序中可能同时运行着多个不同的函数。
JVM 的设计方式建立在几个早期编程环境的多年发展经验之上,尤其是 C 和 C++,因此有多个目的,这些目的都是为了减轻程序员的负担。
包含一个容器,让应用代码在其中运行。
较之 C/C++,提供了一个安全的执行环境。
代开发者管理内存。
提供一个跨平台的执行环境。
介绍 JVM 时往往都会提到这些目的。
前面介绍 JVM 和字节码解释器时已经提到了第一个目的,即 JVM 是应用代码的容器。
第 6 章介绍 Java 环境如何管理内存时会讨论第二个和第三个目的。
第四个目的有时也说成“一次编写,到处运行”,意思是 Java 类文件可从一个运行平台迁移到另一个平台,只要有可用的 JVM,就能正常运行。
也就是说,Java 程序可以在运行着 OS X 的苹果 Mac 电脑中开发(并转换成类文件),然后把类文件移到 Linux 或微软 Windows(或其他平台)中,无需任何改动,Java 程序依然能运行。
Java 环境被移植到了众多平台中,除了 Linux、Mac 和 Windows 等主流平台外,还支持很多其他平台。本书使用“大多数实现”来概括大多数开发者能接触到的平台。Mac、Windows、Linux、Solaris、BSD Unix 和 AIX 等被视为“主流平台”,都算在“大多数实现”的范围之内。
除了上述四个主要目的之外,JVM 还有一个设计方面的考量很少被提及和讨论,即 JVM 使用运行时信息进行自我管理。
20 世纪 70 年代和 80 年代对软件的研究表明,程序运行时的行为有很多有趣且有用的模式无法在编译时推论得出。JVM 是真正意义上第一个利用这项研究结果的主流平台。
JVM 会收集运行时信息,从而对如何执行代码做出更好的决定。也就是说,JVM 能监控并优化运行在其中的程序,而没有这种能力的平台则做不到这一点。
一个典型的例子是,在运行 Java 程序的生命周期中,各组成部分被调用的次数并不都是相同的,有些部分调用的次数远比其他部分多得多。Java 平台使用一种名为 JIT 编译(just-in-time compilation)的技术解决这个问题。
在 HotSpot JVM(Sun 为 Java 1.3 开发的 JVM,现在仍在使用)中,JVM 首先识别程序的哪一部分调用最频繁(这一部分叫“热点方法”),然后跳过 JVM 解释器,直接把这一部分编译成机器码。
JVM 利用可用的运行时信息,让程序的性能比纯粹经解释器执行更高。事实上,很多情况下,JVM 使用的优化措施得到的性能提升,已经超过了编译后的 C 和 C++ 代码。
描述 JVM 必须怎样运行的标准叫 JVM 规范。
1.1.3 Java生态系统是什么
Java 语言易于学习,而且和其他编程语言相比,拥有的抽象更少。JVM 为 Java 语言(或其他语言)的运行提供了坚实的基础,并且它写出的程序性能高且是可移植的。这两种相互联系的技术放在一起,可以让企业放心选择在何处下力发展。
然而,Java 的优势不止于此。自 Java 初期开始,就形成了范围极广的生态系统,里面有大量的第三方库和组件。也就是说,开发团队能从现有的连接器和驱动器中获益良多,从中他们能获得几乎任何能想到的技术,有些收费,有些则开源。
在当下的技术生态系统中,很少出现某个技术组件不提供 Java 连接器的情况。不管是传统的关系数据库,还是 NoSQL,或者各种企业级监控系统和消息系统,都能集成到 Java 中。
这些正是企业和大型公司采用 Java 技术的主要驱动力。使用现有的库和组件能释放开发团队的潜能,让开发者作出更好的选择,利用 Java 核心技术实现最佳的开放式架构。
Java 环境被移植到了众多平台中,除了 Linux、Mac 和 Windows 等主流平台外,还支持很多其他平台。本书使用“大多数实现”来概括大多数开发者能接触到的平台。Mac、Windows、Linux、Solaris、BSD Unix 和 AIX 等被视为“主流平台”,都算在“大多数实现”的范围之内。