Java运行原理与Java虚拟机 - 张华伟
更新时间:2024-07-12 02:23:01 阅读量: 综合文库 文档下载
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 Zhengzhou 450002 )
Key words:
java virtal machine ;
safety ; byte 1 Java
的运行原理概述
几乎所有的语言均需要通过编译或者解释才可以被我们的 电脑执行。可是 Java
与众不同,它同时需要这两个过程。当我 们写好了一个 Java
源程序的时候, Java
编译程序先将 Java 源程 序翻译为 Java
的虚拟机可以执行的一种叫做字节码( byte code
)的中间代码。然后再由 Java
平台的解释器将这种字节码
文件翻译成本地的机器指令来执行。这个 Java
平台的核心就是 Java
虚拟机(
Java Virtual Machine , JVM )。如下图所示: 图1 Java的运行原理 我们先来看 Java
的编译过程,这个过程与其他程序设计语 言存在很大的不同。例如,像 C++
这样的语言在编译的时候,是
与机器的硬件平台信息密不可分的,编译程序通过查表将所有 对符号的引用转换为特定的内存偏移量以保证程序运行,并且 编译结果是可执行的代码。而 Java
编译器却不将对变量和方法
的引用编译为数值引用,也不确定程序执行过程中的内存布局, 而是将这些符号引用信息保留在一种扩展名为 .class 的字节码
文件中,这种文件的最大特点就是不包含硬件的信息,因此这种 字节码文件还不能在机器上执行,如果需要执行,还要再由 Java
的解释器在解释执行字节码的过程中创立内存布局,然后再通 过查表来确定每一条指令所在的具体地址。 Java
的解释过程也很特别,传统的解释性语言如 BASIC 在
解释执行的时候,是直接将源程序一条一条地通过解释器进行 词法分析、语法分析等最终翻译为本地的机器指令,并在真正 CPU
上执行。而 Java
的解释过程是先通过 Java
虚拟机读取 Java
字节码文件,然后再将其转换成和系统硬件相关的本地指令,并 最终在 CPU
上执行。
其实,也正是因为这种特殊的编译和解释过程,才使得 Java
这种语言具有了平台无关性和安全性。这些特性的关键在于 Java
的字节码设计。字节码是一套用来在 Java
系统下运行时执
行的高度优化的指令集,执行该指令集的系统是 Java 的虚拟
机。在其标准形式下, Java
的虚拟机就是一个字节码解释器。 为了更好地了解 Java
虚拟机在解决程序可移植和安全等方面所 发挥的作用,我们需要对
Java
虚拟机做更深入的了解。 2 Java
虚拟机的结构 Java
虚拟机是使字节码文件具有跨平台能力的核心结构。 其中,包含对 Java
字节码进行翻译的解释器。该解释器解释执
行字节码的过程分为三步进行:代码的装入、代码的校验和代码 的执行。装入代码的工作由“类装载器”( classloader )完成。类
装载器负责装入运行一个程序需要的所有代码,这也包括程序 代码中的类所继承的类和被其调用的类。当类装载器装入一个 类时,该类被放在自己的名字空间中。除了通过符号引用自己 名字空间以外的类,类之间没有其他办法可以影响其他类。在 作者简介:张华伟( 1977- ),女,河南省郑州市人,硕士,实验师,主 要研究方向:计算机应用研究; 魏 庆( 1977- ),男,河南郑州人,硕士,讲师,主要研究方向:程序 开发与应用。
本台计算机上的所有类都在同一地址空间内,而所有从外部引 进的类,都有一个自己独立的名字空间。这使得本地类通过共 享相同的名字空间获得较高的运行效率,同时又保证它们与从 外部引进的类不会相互影响。当装入了运行程序需要的所有类 后,解释器便可确定整个可执行程序的内存布局。解释器为符 号引用特定的地址空间建立对应关系及查询表。通过在这一阶 段确定代码的内存布局, Java
很好地解决了由超类改变而使子
类崩溃的问题,同时也防止了代码对地址的非法访问。随后,被 装入的代码由字节码校验器进行检查。校验器可发现操作数栈 溢出、非法数据类型转化等多种错误。通过校验后,代码便开始 执行了。 可见, Java
虚拟机的基本执行单元是 .class
文件。一个 Java
的源程序经过编译后会形成一个或多个 .class
文件。因此,带有 多个 .class 文件的 Java
程序在执行时与传统程序相比就有其特
殊性。传统的程序在运行前,系统要装入含有全部程序码的单 一执行文件,而 Java
虚拟机在执行程序时则不同,它遵循“即用 即装入”的原则。具体讲,由于一个 .class
文件可以引用许多其 它 .class
文件,当运行的类需要其他类时, Java
虚拟机即从网络或 本地文件系统装入 .class 文件。 当然,一个 Java
程序也可以直接被编译为本机代码,但是这 对于连接到 Internet 上的每一种 CPU
类型,都要有该程序的对应
版本。这显然不是一个可行的解决方案。因此,对字节码进行 解释是编写真正可移植性程序最容易的方法。 3 Java
虚拟机的安全性 需要注意的是, 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 符合性
等,保证病毒和其他恶意程序不会侵犯本地系统。认证器包括 四个阶段的操作:类文件认证、类型系统认证、字节码认证和运 行时类型与访问检查。此外,认证器在检查期间还能识别算法 操作的上溢和下溢等其他可能发生在运行期间的程序错误。 4 Java
虚拟机的性能
由于在当前主机操作系统中加上了 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 虚拟机 45 Java
虚拟机的发展 通过虚拟机来执行 Java
是最常见的架构方式。这是由于: 一方面是虚拟机的 Java
平台最容易被实现,另一方面是只要有
了虚拟机就可以在不更换现有的系统平台(操作系统和 CPU )下
稳定地执行 Java
程序。目前,多数主流的系统平台(包括 Win? dows 、 Linux 、 Mac 、
Solaris... )都已内置 Java
的虚拟机了。
实际上,只要能够执行 Java
字节码文件的平台,都可以称之 为 Java
平台。除了虚拟机这种常见的架构方式之外,实现 Java
平台的方式还有两种,分别是: Java
操作系统( Java Operating System ); Java 芯片( Java Chip )。
其实,如果把 Java
虚拟机整合进已有的操作系统中(例如: MacOSX ),或是打造一个全新的操作系统来专门执行 Java 字节
码(例如: JavaOS ),这类能直接执行 Java
字节码的操作系统也可 视为 Java
平台。这样的执行架构大致上可以分成三层,分别是: 第一层(最上层)的 Java
字节码;第二层的 Java
操作系统; 第三
层(最底层)的芯片。 如果把 Java
操作系统和已有的芯片整合起来,成为一组新 的芯片(例如: ARM7 、 ARM9 ),或者打造一个全新的 Java 专用芯 片(例如: aJile aJ-100 ),那么,此一种类的芯片也是 Java 平台。
这样的执行架构大致上可以分成两层,分别是:第一层(最上层) 的 Java
字节码;第二层(最底层)的 Java 芯片。
一般来说,通过 Java
操作系统来执行 Java
字节码,效率会比
虚拟机的方式更好。因此, Java
虚拟机被整合进操作系统中来
提升该操作系统的附加价值的这种做法有可能会成为一种趋势 (例如: MacOSX
就是很好地整合了 Java
和操作系统)。但是,如 果设计一套只能执行 Java
的全新操作系统,可能不容易成功,因
为全新的操作系统势必会面临驱动程序不足的严重困扰。为 此,加上事实证明,操作系统的 Java
平台比虚拟机的 Java 平台效
率提升不如预期多,所以 IBM
和 Sun
合作的纯 Java
操作系统最终
没有成功。由于虚拟机的技术一直在进步,因此执行效率一直 都有持续的提升,目前已经相当逼近 Java
操作系统的架构方式,
所以虚拟机的方式应该会继续成为 PC
上的主流 Java 平台。
无论是虚拟机还是 Java
操作系统,由于 Java
语言是解释型 语言 ,
因此在一般的通用处理器上其运行速度比起编译型语言都 会慢一些。 Sun
公司为了进一步推广 Java
的应用,还推出了 Java
芯片。这些芯片可以说是 Java
虚拟机的硬件实现。与通用芯片 和解释器构成的虚拟机不同, Java
芯片可以直接执行字节码。 也就是说,字节码就是 Java
芯片的指令集。这种利用芯片的方 式,对于 Java
程序的执行速度会有更大的提升,毕竟硬件的速度
比软件快许多,这种方式以后会成为嵌入式系统的主流。但是, 这种方式把 Java
整个变成硬件平台,当然,也就不再适合跨平台
了。 6
结束语
从本文的分析可以看出,无论是标准化组织、终端厂商、运 营商,还是应用开发者,都在促进 Java
跨平台特性,减少各平台 间的分裂性,在繁荣 Java
的应用方面做出了不少努力。而作为 Java
业界的领头羊, Sun MicroSystems
也计划打造一款整个操 作系统都是由 Java
实现的纯 Java
终端,而 ARM
公司也有推出专 门针对 Java
指令的加速芯片,通过硬件加速来提高 Java 的执行
效率。由此可见,虽然目前 Java
还没有百分之百地实现跨平台
性和执行的高效性,但是,我们相信随着业界的共同努力, Java
的发展空间会越来越大。 参考文献: [1] 刘治波 .Java
虚拟机简析 [J].
济南职业学院学报, 2008 ,( 1 ) .
[2] 张学红 ,
李小慧 ,
杜瑞庆 .Java
中内存泄露及垃圾回收机制 [J]. 唐山师
范学院学报, 2008 ,( 2 ) . [3] 龙银香 .Oracle 数据库中 Java
执行的安全性研究 [J].
景德镇高专学报 , 2004 ,( 4 ) . 421
正在阅读:
2013中考数学第一轮总复习基础题(活页42课时)第1课时实数的有关04-10
第四讲 课堂师生交往的模式及师生沟通技巧06-19
o血型配对02-18
中外教育简史应用1-510-05
七年级历史《百家争鸣》教案【优秀2篇】03-23
历史教师竞聘岗位演讲稿【优秀5篇】03-25
寻找运气的人10-08
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 华伟
- Java
- 原理
- 运行
- 虚拟
- 2011年高考试题 - 理综生物(新课标卷)
- 上海高一化学知识点总结
- 宜昌市西陵区背街小巷整治一期工程施工组织设计
- 《长城》教学设计
- 加强矿山地质环境保护与恢复治理方案编制工作(提纲)
- 八年级数学下册20.1数据的集中趋势20.1.1平均数教案新版新人教版
- 解决污水处理中泡沫
- 中华人民共和国国家标准--村镇规划标准
- 机械工厂年时基数设计标准JBT2-2000
- 宏观经济学第六章
- 钻孔灌注桩评估报告A1
- 微机接口技术实验讲义
- 2016年雅思写作大作文机经
- 高中政治一年级
- 太重系列电铲参数介绍(WK4-WK75) - 图文
- 四川省企业产品标准备案与执行标准登记管理办法
- 2018年高考文科综合应试指导手册(42页)
- 2011 - 2012学年第二学期一年级语文教学计划
- 无机化学习题及答案
- 矿产资源储量报告及评审中的若干问题