嵌入式Java虚拟机的改进

时间:2022-04-17 11:29:51

摘 要:本文研究了Java技术在嵌入式领域应用中所存在的系统占用资源较多和程序执行效率较低两个关键性难题。在研究国内外目前应用于嵌入式Java虚拟机中的各种性能优化技术和尚待解决的问题的基础上,尝试从对垃圾回收方式改进和虚拟机内部结构改造两方面对两个难题提出了解决的新方法。结合在垃圾回收和虚拟机内部结构方面的改进,本文搭建了一个新的改进型嵌入式Java虚拟机。

关键词:嵌入式Java;虚拟机;垃圾回收

中图分类号:TP307

从1993年美国Sun公司提出Java语言规范和Java虚拟机规范的Java技术以来,关于Java的应用和研究就一直呈逐渐上升的趋势。随着互联网的不断发展,Java语言以其独特的平台无关性和安全性迅速占领了PC端和Server端。现在Java技术已经被广泛的应用到了嵌入式领域,形成了嵌入式Java技术。嵌入式Java技术就是将采用Java语言编写的应用程序嵌入到电话、电视、洗衣机、电冰箱等各类消费类电子产品中,使这些设备具有了计算机的计算、执行等部分功能。并且由于有嵌入式Java技术的互联网接口功能,各种嵌入设备可以安全地通过网络接受和执行应用程序[1]。

Java语言、JVM和Java API是Java技术主要组成部分,而JVM(Java虚拟机)是其在嵌入式系统应用的主要瓶颈。嵌入式系统与微型计算机系统有很大的差异,所以Java语言在嵌入式系统的应用中所出现的问题也常有它自己的特色。Java语言的全新处理方式其关键创新有两点:(1)编译在服务器端进行,编译过程中只是将Java源程序编译为与平台无关的字节码型中间代码;(2)客户端上安装了Java虚拟机JVM,JVM以解释的方式执行中间代码程序。Java语言其独特处理过程如图1所示:

从上面的图可知,经过编译之后Java程序所生成的不是能直接在处理器上运行的机器码,而只是在虚拟机上运行的Java字节码型中间代码,然后由不同平台上虚拟机根据自己平台将字节码译成其处理器真正可执行的机器码后运行。由于Java程序存在这一比较复杂的编译、译码过程,其运行所耗费的时间将会是C或C++等高级语言编译的相同功能指令程序的好几倍,甚至几十倍。因此,在Java得到广泛应用的同时,也存在一个影响使用的最大问题—执行速度慢。关于如何提高Java虚拟机的执行效率方面的研究已经成为了Java研究的热点[2]。

针对嵌入式Java虚拟机存在的两个难题——硬件资源少和运行速度慢,本文在嵌入式Java虚拟机的结构设计和内存管理方面作了一些探索研究,主要包括两个方面:数据堆栈结构优化和垃圾回收算法的改进。

1 数据堆栈结构优化

现在嵌入式系统中常采用的是基于堆栈的处理器,因为这类处理器支持比较短小的程序,在资源有限的嵌入式中也能工作得很好。在执行同样一个程序时,基于堆栈处理器编译出来的机器码要比基于寄存器的处理器编译出来的机器码小好几倍。但基于寄存器的处理器也有一个极其重要的优势:速度快。基于堆栈的处理器,它的堆栈几乎都是在外部内存里的,这就造成即使执行一个面向堆栈的基本操作,处理器也需要到内存里去读取数据,大大降低了基于堆栈的处理器的执行速度[3]。经过对基于堆栈的处理器与基于寄存器的处理器优缺点的分析,它们的优势和劣势主要体现在具体的硬件上。由于虚拟机是完全以软件构成的,没有硬件设备,所以在本文虚拟机设计当中不像一般Java虚拟机那样完全采用基于堆栈式的结构,而是吸取了这两种结构的优点,采用了既有堆栈又有寄存器的机器结构。

2 垃圾回收算法改进

常用的垃圾回收算法有标记压缩法、停止拷贝法以及标记清除法,它们都有一个共同的特点,即一次性对整个内存的垃圾进行回收,在垃圾的回收过程当中可能会致使其它程序被明显地中断,影响了这些方法在实时系统等对系统运行时间有较高要求的环境中的应用。

针对这些问题本文采用增量式跟踪法来进行优化,增量式跟踪法的基本思想是将垃圾回收过程分成若干小片与应用程序交叉运行。

通过下图的三色模型对垃圾检测过程进行介绍。在内存检查过程开始时,所有的结点都为白色。从根结点开始检查,将可以直接访问到的结点标记为灰色,然后对灰色结点进行检查,一个灰色结点的所有子孙都经过检查后,则将此结点改为黑色,整个检查过程结束后,只剩下黑色结点和白色结点,此时黑色结点对象为可以访问的对象,而白色结点则是需要回收的对象。因为这一标记回收过程是和应用程序“并行”工作的,所以为了保证垃圾回收的正确性,程序的执行必须要遵守一条原则,即应用程序不能将一个黑色结点上的指针指向一个白色结点,原因是可能导致此结点可能被错误地作为垃圾清除掉,如图2所示,当A的子孙检查完成后,B和C被标记为灰色,下一步应该对B和C的子孙进行标记,如果此时发生了图3中所示的指针变化,则结点D将无法再被检查到,从而可能导致被错误地清除。为了避免发生这种错误,可以采取在回收的程序段设置读屏障或写屏障的方法。在读屏障方法中,对应用程序访问对象的过程进行监视,如果发现其试图访问一个标记为“白色”对象的指针,则立即将此对象置为灰色;在写屏障方法中,如果应用程序为某个对象设置指向其它对象的指针,则将其记录下来,确保检查程序能对此对象进行正确检查。

在采用写屏障方法时可以采取两种算法:一是对所有被修改的指向白色对象的指针保留记录,即当检测到应用程序试图修改指向白色对象的指针时,首先将此指针保存到一个专门的数据结构并压入堆栈当中,例如图2中将BD的指针保存在堆栈当中,从而后面可以根据堆栈当中的数据对D进行检查;另一种方法是检测到应用程序试图将指向白色对象的指针复制到黑色对象时,将黑色对象修改为灰色,图2中将A修改为灰色,从而使垃圾检测程序能对A的子孙再次检查。

3 显式内存管理法和自动内存管理法比较及内存管理法的选择

显式内存管理法把追踪已分配内存的责任放在了程序员人员的肩上,由于程序员可以在编写程序时对内存管理进行设置,所以该方法可以使系统中的内存分配算法简单一些,相关的标记等工作也会少一些,但也会可能由于程序员出错造成系统不稳定等问题。显式内存管理法下的程序要简短一些,这是因为用不着在程序里额外插入那些内存回收工作的指令或数据。显式内存管理法还能让程序编写人员对内存分配中的具体情况有一个更好的掌握[4]。

内存自动管理办法,它的内存回收工作有完善、安全的细节。这使程序编写人员能够集中注意力解决真正的应用问题。心理学统计证明,普通人只能同时跟踪记忆7件事。如果软件开发人员在编写程序的同时还不得不考虑内存回收问题的话,需要他跟踪记忆的事项就会大大超出普通人的极限。自动内存管理法恰好解决了这个问题。

而在Java虚拟机规范中规定了垃圾回收任务需由虚拟机这个底层运行系统来完成,所以本虚拟机在设计时选择了具备自动垃圾回收的功能的自动内存管理法,但在分配内存时可借鉴显式内存管理法的一些思想。

本文中所做的研究都是针对提高Java虚拟机执行效率方面的研究,未来要实现一个应用于商业实用的嵌入式Java虚拟机,还必须提高Java虚拟机的安全性。Java的安全模型是其最重要特点之一,正是因为Java比以往的程序开发语言具有更高的安全性,才使Java成为了最适合网络环境的技术。Java虚拟机中一般都采用了沙箱安全模型这一安全机制,重点来保护终端用户不受从网上下载的、或来自不可靠来源的、恶意程序的侵犯。

本文设计的虚拟机中,只具备了基本的安全检查,对恶意程序的纠错能力还不足,所以未来在加强本虚拟机的安全性方面还有许多工作要做。

参考文献:

[1]刘科,许洪华,付德永.基于以太网和嵌入式Web Server的控制系统设计研究[J].微计算机信息,2006,22(29):143-145.

[2]Bill Blunden.Virtual Machine Design and Implementation in C/C++[M].Wordware Publishing,Inc,2005.

[3]李蜀瑜,吴健,胡正国.嵌入式Java Script解释器的设计与实现[J].计算机应用研究,2003,1:128-130.

[4]黄广君,吴健,胡正国.关于KVM中预处理程序的研究[J].计算机应用研究,2002,10:27-28.

作者简介:崔琳(1979-),河南南阳人,讲师,主要研究方向:计算机应用技术;马丽艳(1983-),河南开封人,助理实验师,研究方向:计算机应用技术。

作者单位:河南化工职业学院,郑州 450042

上一篇:数控加工工时消耗分析及数据采集方法研究 下一篇:网络化伺服系统控制方法研究