第1章 Java的开发运行环境
学好Java最重要的一个步骤就是上机编程,熟悉Java的开发运行环境是成为Java程序员的第一步。本章将详细介绍如何安装并配置好Sun公司提供的JDK1.5 for Windows,如何编制一个简单的Java程序,如何编译一个Java源程序,如何运行编译好的class文件以及如何避免初学者常犯的错误。通过本章的学习,将轻松地迈入Java的殿堂。
1.1 Java的运行环境与虚拟机
任何一个可执行文件,都必须在某个平台上才能运行。例如,Windows下的exe文件,必须在Windows环境下、X86硬件平台上才能运行。这些exe文件,通常是使用C/C++、Pascal或VB等语言编程,然后通过编译、链接而形成的。在这些可执行文件中,包含了运行它的硬件平台的相关信息,所以如果要把它移植到其他平台上,必须要重新编译,甚至要修改源文件。
Java和这些语言不同,它的最大特点就是平台无关性。Java文件经编译后,生成的是一个后缀名为class的文件。这是一种字节码文件,它不像普通可执行文件那样包含硬件信息,而是完全与硬件平台无关,也就是无法直接由操作系统调用运行。所以Java的应用程序,需要一个更为复杂的平台才能运行。这个运行平台,包括计算机操作系统、适配器、Java虚拟机、Java基本软件和Java应用程序接口,它们负责将Java的字节码翻译成硬件可以接受的指令。整个运行系统的结构如图1.1所示。
图1.1 Java运行系统
Java运行系统执行Java应用程序的过程包括三个步骤:首先是代码的装入,然后是代码的验证,最后是代码的执行。
代码的装入由类装配器完成,它主要负责装入程序运行时所需要的全部代码,包括程序运行中调用到的其他类。当类装配器装入一个类后,该类被放在自己的命名空间中,除了通过符号引用其他类之外,该类不能影响其他类所在的空间。当装入了运行程序所需要的所有类后,运行系统就能确定整个可执行程序的内存布局。
然后,被装入的代码将由字节码验证器进行安全检查,以确保字节代码不存在违反访问权限、不规范的数据类型和非法调用等问题。
通过校验之后,代码就可以运行了。Java的字节码有两种运行方式:
解释执行方式:通过“解释器”,将字节码翻译成机器码,然后由“运行支持库”将机器码送往硬件执行。整个执行过程是一边翻译一边执行,称为解释执行。Java系统一般采用这种方式。
即时编译方式:通过“代码生成器”,先一次性地将所有字节码翻译成适用于特定计算机系统的机器码,然后送往硬件执行。对程序运行速度要求较高时,一般采用这种方式。
从图1.1可以看出,Java的字节码并没有直接运行在硬件平台上,而是在一个虚拟的软件平台上运行。这个虚拟的软件平台,被称为Java虚拟机(Java Virtual Machine,JVM)。为了让编译产生的字节码可以更好地解释与执行,通常把JVM分成6个功能模块:JVM解释器、指令系统、寄存器、栈、存储区和碎片回收区。
JVM解释器:JVM解释器负责将字节码转换成为CPU能执行的机器指令。
指令系统:指令系统同硬件计算机很相似。一条指令分成操作码和操作数两部分。操作码为8位二进制数,操作数可以根据需要而定。操作码是为了说明一条指令的功能,所以JVM可以有多达256种不同的操作指令。
寄存器:JVM有自己的虚拟寄存器,这样就可以快速地和JVM的解释器进行数据交换。为了实现必需的功能,JVM设置了4个常用的32位寄存器:pc(程序计数器)、optop(操作数栈顶指针)、frame(当前执行环境指针)和vars(指向当前执行环境中第一个局部变量的指针)。
栈:JVM栈是指令执行时数据和信息存储的场所和控制中心,它提供给JVM解释器运算时所需要的信息。
存储区:JVM存储区用于存储编译后的字节码等信息。
碎片回收区:JVM碎片回收,是指将那些使用后的Java类的具体实例从内存中进行回收。因此,可以避免开发人员自己编程控制内存的麻烦。随着JVM的不断升级,其碎片回收技术和算法也更加合理。比较经典的算法有引用计数、复制、标记-清除和标记-整理。在JVM 1.4.1版以后,产生了一种代收集技术。简单地说,就是利用对象在程序中生存的时间划分成代,以这个代为标准进行碎片回收。
说明:JVM的运用,真正让Java实现了“一次编译,处处运行”,它是整个运行系统的核心