Java运行原理与Java虚拟机

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2009年第10

Java运行原理与Java虚拟机

张华伟,魏庆

(河南财经学院,河南郑州450002)

摘要:Java独特的编译和解释过程,使得Java语言具有了平台无关性和安全性,而这些特性的关键在于Java字节码的设计以及运行该字节码的Java虚拟机。本文旨在从Java的运行原理入手,总结了Java虚拟机的结构特点、安全性及其发展。

关键词:Java虚拟机;安全;字节码

中图分类号:TP311.15文献标识码:A

Java Opearting Principle and Java Virtual Machine

ZHANG Hua-wei,WEI Qing

(Henan Polytechnic Institute,Henan Zhengzhou450002)

Key words:java virtal machine;safety;byte

1Java的运行原理概述

几乎所有的语言均需要通过编译或者解释才可以被我们的

电脑执行。可是Java与众不同,它同时需要这两个过程。当我

们写好了一个Java源程序的时候,Java编译程序先将Java源程

序翻译为Java的虚拟机可以执行的一种叫做字节码(byte

code)的中间代码。然后再由Java平台的解释器将这种字节码

文件翻译成本地的机器指令来执行。这个Java平台的核心就是

Java虚拟机(Java Virtual Machine,JVM)。如下图所示:

图1Java的运行原理

我们先来看Java的编译过程,这个过程与其他程序设计语

言存在很大的不同。例如,像C++这样的语言在编译的时候,是

与机器的硬件平台信息密不可分的,编译程序通过查表将所有

对符号的引用转换为特定的内存偏移量以保证程序运行,并且

编译结果是可执行的代码。而Java编译器却不将对变量和方法

的引用编译为数值引用,也不确定程序执行过程中的内存布局,

而是将这些符号引用信息保留在一种扩展名为.class的字节码

文件中,这种文件的最大特点就是不包含硬件的信息,因此这种

字节码文件还不能在机器上执行,如果需要执行,还要再由Java

的解释器在解释执行字节码的过程中创立内存布局,然后再通

过查表来确定每一条指令所在的具体地址。

Java的解释过程也很特别,传统的解释性语言如BASIC在

解释执行的时候,是直接将源程序一条一条地通过解释器进行

词法分析、语法分析等最终翻译为本地的机器指令,并在真正

CPU上执行。而Java的解释过程是先通过Java虚拟机读取Java

字节码文件,然后再将其转换成和系统硬件相关的本地指令,并

最终在CPU上执行。

其实,也正是因为这种特殊的编译和解释过程,才使得Java

这种语言具有了平台无关性和安全性。这些特性的关键在于

Java的字节码设计。字节码是一套用来在Java系统下运行时执

行的高度优化的指令集,执行该指令集的系统是Java的虚拟

机。在其标准形式下,Java的虚拟机就是一个字节码解释器。

为了更好地了解Java虚拟机在解决程序可移植和安全等方面所

发挥的作用,我们需要对Java虚拟机做更深入的了解。

2Java虚拟机的结构

Java虚拟机是使字节码文件具有跨平台能力的核心结构。

其中,包含对Java字节码进行翻译的解释器。该解释器解释执

行字节码的过程分为三步进行:代码的装入、代码的校验和代码

的执行。装入代码的工作由“类装载器”(classloader)完成。类

装载器负责装入运行一个程序需要的所有代码,这也包括程序

代码中的类所继承的类和被其调用的类。当类装载器装入一个

类时,该类被放在自己的名字空间中。除了通过符号引用自己

名字空间以外的类,类之间没有其他办法可以影响其他类。在:张华伟(1977-),女,河南省郑州市人,硕士,实验师,主

要研究方向:计算机应用研究;

魏庆(1977-),男,河南郑州人,硕士,讲师,主要研究方向:程序

开发与应用。

·计算技术与自动化·

本台计算机上的所有类都在同一地址空间内,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布局,Java 很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问。随后,被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出、非法数据类型转化等多种错误。通过校验后,代码便开始执行了。

可见,Java 虚拟机的基本执行单元是.class 文件。一个Java 的源程序经过编译后会形成一个或多个.class 文件。因此,带有多个.class 文件的Java 程序在执行时与传统程序相比就有其特殊性。传统的程序在运行前,系统要装入含有全部程序码的单一执行文件,而Java 虚拟机在执行程序时则不同,它遵循“即用即装入”的原则。具体讲,由于一个.class 文件可以引用许多其它.class 文件,当运行的类需要其他类时,Java 虚拟机即从网络或本地文件系统装入.class 文件。

当然,一个Java 程序也可以直接被编译为本机代码,但是这对于连接到Internet 上的每一种CPU 类型,都要有该程序的对应版本。这显然不是一个可行的解决方案。因此,对字节码进行解释是编写真正可移植性程序最容易的方法。

3Java 虚拟机的安全性

需要注意的是,Java 虚拟机的取得要谨慎小心。因为大多数Java 安全的措施都靠无病毒的Java 虚拟机来完成,如果用户下载了一个带有病毒的虚拟机,则虚拟机不仅失去防范功能,本身也可能成为用户的隐患。Sun 等主要提供Java 虚拟机下载的公司都对自己的Java 虚拟机经过了彻底检查,下载和操作通常是安全的。可以这么说,下载安全的Java 虚拟机是对付病毒入侵和保障程序安全的第一道防线。

有了安全的虚拟机之后,对Java 程序进行解释执行的方式也是保证Java 程序安全性的一个重要原因。因为每个Java 程序的运行都在Java 虚拟机的控制之下,Java 虚拟机可以包含这个程序并且能阻止它在系统之外产生副作用。例如,Java 程序从网络上下载运行时必然会带来许多不安全因素。一些恶意的Hacker 可以直接写出字节代码段攻击用户节点,如删除文件、搞乱硬盘或未经用户许可在网上发送本地信息等。有了Java 虚拟机,这些防卫本地机被攻击的任务就可以交给它来完成了。

这是因为Java 虚拟机本身提供了几种安全机制,这些机制可以保证在执行.class 文件前,首先要对其进行验证。如果没有通过验证,则不执行并给出错误信息。相反,如果程序成功地经

过验证阶段,Java 虚拟机将运行解释器读取字节码,把字节码转换成操作系统硬件相关的指令,并在真正的CPU 上执行。其中,安全管理器和Java 类文件认证器两种主要的机制。

安全管理器是安全的实施者,它是一个可扩展类,提供加在应用程序和特殊系统上的安全措施,实现Java 虚拟机的安全策略,建立Java 程序的命名空间,限制对网络、本地文件系统和程序其它部分的访问(程序的命名空间是由操作系统或这里的Ja⁃va 虚拟机所建立的程序边界,该程序无法访问命名空间以外的

资源)。

Java 认证器在.class 文件运行前完成对该文件的安全检查,

确保Java 字节码符合Java 虚拟机规范。Java 平台通过使用认证

器查看类文件的句法和词法的正确性、检查版本及API 符合性等,保证病毒和其他恶意程序不会侵犯本地系统。认证器包括四个阶段的操作:类文件认证、类型系统认证、字节码认证和运行时类型与访问检查。此外,认证器在检查期间还能识别算法操作的上溢和下溢等其他可能发生在运行期间的程序错误。

4Java 虚拟机的性能

由于在当前主机操作系统中加上了Java 虚拟机层,因此被解释的程序的运行速度通常确实会比同一个程序被编译为可执行代码的运行速度慢一些。除了解释过程会影响Java 行速度之外,还有其他一些原因也会影响Java 比如:读入的字节码是在运行时进行验证,间,而传统程序在程序编译时即完成验证工作;Java 完全依赖堆栈,运算操作都在堆栈上执行,而传统编译型语言在编译时就已经进行多种优化工作,很多计算操作可直接在寄存器中完成。还有程序执行期间,系统要进行无用内存单元回收工作,在回收过程中,程序还将停止执行,这些无疑也会影响其性能。

不过,针对Java 虚拟机执行程序速度慢的问题,Sun 公司和业界的其他主要公司(如Microsoft,Borland 等)也提出了改进方法。比如,通过多线程编程来提高Java 程序的执行效率。当然,最直接的方法还是Java 程序动态的编译为本机代码。SUN 公司在Java2发行版中提供了一个字节码编译器——JIT (Just In Time ),JIT 编译器在程序开始执行前先将所有字节码翻译成本地机器码,然后再将翻译后的机器码放在CPU 上运行。实际上,JIT 仍是Java 虚拟机的一部分,它不能将整个Java 程序一次性全部编译为可执行的代码,而是只编译它运行时需要的代码。这是因为Java 要执行各种检查,而这些检查只有在运行时才执行。尽管如此,这种即时编译执行的方法仍然使其性能得到较大提高。即使

对字节码进行动态编译后,Java 程序的可移植性和安全性仍能得到保证,因为运行时系统(该系统执行编译)仍然能够控制Java 程序的运行环境。无论Java 程序被按照传统方式解释为字节码,还是被动态编译为可执行代码,其功能是相同的。

张华伟:Java 运行原理与Java 虚拟机

相关文档
最新文档