Java基本环境介绍

来源:互联网 发布:网络与新媒体专业介绍 编辑:程序博客网 时间:2024/05/17 09:15

Java基本环境介绍

一、Java和JVM简史

Java 1.0(1996年)

这是Java 的第一个公开发行版,只包含212个类,分别放在八个包中。Java 平台始终关注向后兼容性,所以使用Java1.0编写的代码,不用修改或者重新编译,依旧能在最新的Java8中运行。

Java 1.1(1997年)

这一版Java平台是原来的两倍多,并且引入了“内部类”和第一版反射 API。

Java 1.2(1998年)

这是Java一个非常重要的版本。这一版Java平台是原来的三倍,而且首次出现了集合API(包括 Set、Map 和 List)1.2版增加的新功能过多,Sun不得不把平台重新命名为“Java 2Platform”。这里的“Java2”是商标,而不是真实的版本号。

Java 1.3(2000年)

这其实是个维护版本,主要用于修正缺陷,解决稳定性,并提升性能。这一版还引入了 HotSpot Java 虚拟机,这个虚拟机现在还在使用(不过有大量的修改和改进)。

Java 1.4(2002年)

这也是一个重要的版本,增加了一些重要的功能,例如高性能低层 I/O API、处理文本的正则表达式、XML和 XSLT库、SSL支持、日志 API 和加密支持。

Java 5(2004年)

这一版Java更新幅度很大,对核心语言做了很多改动,引入了泛型、枚举类型(enum)、注解、变长参数方法、自动装包和新版for循环改动的量非常大,所以不得不修改主版本号,以新的主版本号发布。这一版包含 3562个类和接口,分别放在 166 个包中在增加的内容中,值得一提的有并发编程的实用工具、远程管理框架和类,以及 Java虚拟机本身的监测程序。

Java 6(2006年)

这一版也主要是维护和提升性能,引入了编译器 API,扩展了注解的用法和适用范围,还提供了绑定,允许脚本语言和Java交互这一版还对JVM和Swing GUI技术进行了缺陷修正和改进。

Java 7(2011年)

这是甲骨文公司接管 Java 后发布的第一个版本,包含语言和平台的多项重要升级。这一版引入了处理资源的 try语句和NIO.2 API,让开发者编写的资源和I/O处理代码更安全且不易出错。方法句柄 API 是反射API的替代品,更简单也更安全,而且打开了动态调用(invokedynamic)的大门(Java 1.0 之后第一种新字节码)。

Java 8(2014年)

这是最新版Java,变动的幅度是自Java5(甚至可能是自Java出现)以来最大的一次。 这一版引入的 lambda 表达式有望显著提升开发者的效率;集合 API 也升级了,改用 lambda实现,为此,Java 的面向对象实现方式也发生了根本性变化。其他重要更新包括:实现运行在JVM中的JavaScript(Nashorn),新的日期和时间支持,以及 Java 配 置(用于生成不同版本的 Java,尤其适合部署无界面或服务器应用)。

二、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 是应用代码的容器。

第四个目的有时也说成“一次编写,到处运行”,意思是 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-intime compilation)的技术解决这个问题。

在 HotSpot JVM(Sun 为 Java 1.3 开发的 JVM,现在仍在使用)中,JVM 首先识别程序的
哪一部分调用最频繁(这一部分叫“热点方法”),然后跳过 JVM 解释器,直接把这一部 分编译成机器码。

JVM 利用可用的运行时信息,让程序的性能比纯粹经解释器执行更高。事实上,很多情况
下,JVM 使用的优化措施得到的性能提升,已经超过了编译后的 C 和 C++ 代码。

描述 JVM 必须怎样运行的标准叫 JVM 规范。

三、Java程序的生命周期

为了更好地理解 Java 代码是怎么编译和执行的,以及 Java 和其他编程环境的区别,请看图 1-1 中的流程图。
这里写图片描述
图 1-1:Java 代码是怎么编译和加载的

整个流程从 Java 源码开始,经过 javac 程序处理后得到类文件,这个文件中保存的是编译
源码后得到的 Java 字节码。类文件是 Java 平台能处理的最小功能单位,也是把新代码传
给运行中程序的唯一方式。
新的类文件通过类加载机制载入虚拟机(有关类加载机制更详细的说明参见第 10 章),从
而把新类型提供给解释器执行。

常见问题解答

这里将讲解Java 和在 Java 环境中编写的程序的生命周期的最常见问题。

1. 字节码是什么?
开发者首次接触 JVM 时,可能认为它是“电脑中的电脑”,然后顺其自然把字节码理解为 “内部电脑中 CPU 执行的机器码”或“虚拟处理器执行的机器码”。
其实,字节码和运行于硬件处理器中的机器码不太一样。计算机科学家视字节码为一种
“中间表现形式”,处在源码和机器码之间。
字节码的目的是,提供一种能让 JVM 解释器高效执行的格式。

2. javac是编译器吗?
编译器一般生成机器码,而 javac 生成的是和机器码不太一样的字节码。不过,类文件有 点像对象文件(例如 Windows 中的 .dll 文件,或 Unix 中的 .so 文件),人类肯定读不懂。
在计算机科学理论的术语中,javac 非常像编译器的“前半部分”,它生成的中间表现形式 可以进一步处理,生成机器码。
不过,因为类文件的生成是构建过程中单独的一步,类似于 C/C++ 中的编译,所以很多开 发者都把运行 javac 的操作称为编译。在本书里,我们使用术语“源码编译器”或“javac 编译器”表示生成类文件的 javac。
我们把“编译”看作一个单独的术语,表示 JIT 编译,因为只有 JIT 编译才会生成机器码。

3. 为什么叫“字节码”?
指令码(操作码)只占一个字节(有些操作还可以有参数,即跟随其后的字节流),所以 只有 256 个可用的指令。实际上,有些指令用不到,大概只会使用 200 个,而且其中还有 一些是最新版 javac 不支持的。

4. 字节码是优化过的吗?
Java 平台的早期阶段,javac 会对生成的字节码进行大量优化。后来表明这么做是错的。 JIT 编译出现后,重要的方法会被编译成运行速度很快的机器码。之所以要减轻 JIT 编译 器的负担,是因为 JIT 编译获得的效果,比字节码优化多很多,而且字节码还要经过解释 器处理。
5. 字节码真的与设备无关吗?
那字节顺序呢 不管在哪种设备中生成,字节码的格式都是一样的,其中也包括设备使用的字节顺序。如 果你想知道,我告诉你,字节码始终使用大字节序(big-endian)。

6. Java是解释性语言吗?
JVM 基本上算是解释器(通过 JIT 编译大幅提升性能)。可是,大多数解释性语言(例如 PHP、Perl、Ruby 和 Python)都直接从源码解释程序(一般会从输入的源码文件中构建一 个抽象句法树)。而 JVM 解释器需要的是类文件,因此当然需要多一步操作,即使用 javac 编译源码。

7. 其他语言可以在JVM中运行吗?
可以。JVM 可以运行任何有效的类文件,因此,Java 之外的语言可以通过两种方式在 JVM 中运行。第一种,提供用于生成类文件的源码编译器(类似于 javac),以类似 Java 代 码的方式在 JVM 中运行(Scala 等语言采用的是这种方式)。

Java 之外的语言可以使用 Java 实现解释器和运行时,然后解释该语言使用的源码格式。 JRuby 等语言采用的就是这种方式(不过 JRuby 的运行时很复杂,某些情况下能辅助 JIT 编译)。

四、Java的安全性

Java 的设计始终考虑安全性,因此和很多其他现有系统和平台相比有很大的优势。Java 的 安全架构由安全专家设计,而且这个平台发布之后,很多其他安全专家仍在研究和探讨。 专家们一致认为,Java 的安全架构坚固牢靠,在设计层面没有任何安全漏洞(至少还没有 发现)。
Java 安全模型的基础是,严格限制字节码能表述的操作,例如,不能直接访问内存,因此 避免了困扰 C 和 C++ 等语言的一整类安全问题。而且,只要 JVM 加载了不信任的类,就 会执行字节码校验操作,从而避免了大量问题
尽管如此,没有任何系统能保证 100% 的安全性,Java 也不例外。
虽然从理论上讲,设计是牢固的,但安全架构的实现是另外一回事,在某些 Java 实现中, 一直都在发现和修补安全缺陷。
不得不说,Java 8 的延期发布,至少部分原因是发现了一些安全问题,必须要投入时间进 行修复。
我相信,在实现 Java 虚拟机的过程中始终都会发现(并修正)安全缺陷。
不过,值得注意的是,最近发现的 Java 安全问题大都与桌面技术有密切联系。在日常的服 务器端编程方面,Java 仍是当前最安全的通用平台。

五、Java和其他语言比较

Java和C语言比较

• Java 面向对象,C 面向过程。  • Java 通过类文件实现可移植性,C 需要重新编译。  • Java 为运行时提供了全面的监测程序。  • Java 没有指针,也没有指针相等性运算。  • Java 通过垃圾回收提供了自动内存管理功能。  • Java 无法从低层布局内存(没有结构体)。  • Java 没有预处理器。

Java和C++语言比较

• Java 的对象模型比 C++ 简单。  • Java 默认使用虚分派(virtual dispatch)。  • Java 始终使用值传递(不过 Java 中的值也能作为对象引用)。  • Java 不完全支持多重继承。  • Java 的泛型没 C++ 的模板强大(不过危害性较小)。  • Java 无法重载运算符。

Java和PHP语言比较

• Java 是静态类型语言,PHP 是动态类型语言。   • Java 有 JIT,PHP 没有(PHP 6 可能会有)。  • Java 是通用语言,PHP 在网站技术之外很难见到。 • Java 支持多线程,PHP 不支持。

Java和JavaScrip比较

• Java 是静态类型语言,JavaScript 是动态类型语言。  • Java 使用基于类的对象,JavaScript 使用基于原型的对象。  • Java 提供了良好的对象封装,JavaScript 没有提供。  • Java 有命名空间,JavaScript 没有。  • Java 支持多线程,JavaScript 不支持。
1 0
原创粉丝点击