一种基于ARM7的嵌入式Java虚拟机性能优化技术研究

  • 格式:pdf
  • 大小:266.37 KB
  • 文档页数:4

第24卷第5期 2007年5月 计算机应用研究 Application Research of Computers Vo1.24,No.5 Mav 2007 

Java 种基于ARM7的嵌入式 

虚拟机性能优化技术研究 

马嘉,周明天,陈虹 

(电子科技大学计算机与工程学院,四川成都610054) 

摘要:分析了Java字节码的解释执行和基于解释执行的Direct Threaded Interpreter性能优化技术。以Direct 

Threaded Interpreter为基础,提出并实现了一种针对ARM7平台的嵌入式Java虚拟机解释器性能优化方案。对 

嵌入式Java虚拟机的参考实现、Direct Threaded Interpreter优化方案和新优化方案在ARM7平台上的性能比较表 

明,所提出的方案优于前两者。 

关键词:嵌入式Java虚拟机;ARM7;Java字节码;直接线索化解释器 

中图分类号:TP391.9 文献标志码:A 文章编号:1001—3695(2007)05—0097.04 

Performance Optimization Technology for Embedded 

Java VM Based on ARM7 

MA Jia,ZHOU Ming。tian,CHEN Hong 

(School ofComputer Science&Engineering,University ofElectronic Science&Technology ofChina,Chengdu Sichuan 610054,China) 

Abstract:This paper analyzed the execution of Java bytecode and direct threaded optimization technology of interpreter,pro— posed and implemented a new performance optimization solution of embedded Java VM based on direct threaded technology specially for ARM7 platform.The performance comparison Was done on ARM7 platform,demonstrated the better performance of the new solution optimized VM than CLDC RI and direct threaded optimized VM. Key words:KVM;ARM7;Java bytecode;direct threaded interpreter 

Sun公司于2000年公布的J2ME/MIDP参考实现,采用解 

释执行字节码的Java虚拟机。与编译执行相比,解释执行的 

JVM在移动通信设备上具有显著的优点:①虚拟机占用移动 

通信设备非易失性存储空间比较小;②虚拟机运行时占用 

RAM空间比较小;③解释执行核心代码量小;④字节码占用 

RAM空间比较小;⑤实现难度低、可移植性好。现有的具有 

J2ME/MIDP支持的移动通信设备大多是基于该参考实现。 

目前针对Java虚拟机有多种性能优化技术,如基于编译 

运行的优化技术、基于解释运行的优化技术以及一些针对内存 

管理与垃圾回收方面的改良算法等。而基于解释运行的优化 

技术在保持了解释型虚拟机结构简单、可移植性好的优点的同 

时,也有效地提高了解释型虚拟机的性能。 基于目前最常用的低功耗32位处理器ARM7及l6位总 

线结构的主流手机平台,本文提出并实现了一个基于解释执行 

的嵌入式Java虚拟机性能优化方案。 

1 Java字节码的解释执行 

Java字节码(Bytecode)在文献[1]中也被称为Java虚拟机 

指令集(Java Virtual Machine Instruction Set)。与具体的CPU 

指令集类似,Java字节码就是运行于Java虚拟机上的指令集。 Java源程序在被执行之前,要先被编译成Java字节码,再运行 于Java虚拟机上。每条Java字节码长度为一个字节(8 bits), 

因此被称为字节码。字节码之后可能存在一个或多个字节的 

操作数。文献[2]详细定义了所有的标准Java字节码。 

在Java虚拟机内部,采用了一个Interpreter来解释每个 

Bytecode的意义。如图1所示,Interpreter是个大循环,它一直 

不停地从Pc所指到的内存空间抓取Bytecode,翻译成各种不 

同作业平台上相对应的操作,并执行这些操作。 

Interpreter() 、、 { 

的native COde; 

的native code; 

break;J luntil(Java程序结束) 、J , 、…一一一一一一一一一一一一一一一_, 

图1字节码与解释器 

字节码的执行流程如下:①为程序计数器pc赋初值,进入 

解释循环。@Switch指令取出pc指向的字节码,将pc加1;根 

收稿日期:2005—12—25;修返日期:2006—05—11 作者简介:马嘉(1981一),女,四川成都人,硕士研究生,主要研究方向为嵌入式系统及其应用(xierde@hotmail.eom);周明天(1939一),男,广西 

人,教授,博导,主要研究方向为网络计算等;陈虹(1974一),女,四川宜宾人,讲师,主要研究方向为嵌入式Java.

 维普资讯 http://www.cqvip.com ・98・ 计算机应用研究 2007正 

据字节码的值跳转到对应的Case语句。( ̄)Case语句后的解释 

程序执行字节码对应的操作。④回到循环的开头,如果程序没 

有结束,则进行下一次Switch-Case解释过程。 需要指出,Java字节码中大部分堆栈访问和运算指令所执 行的操作是比较简单的。这些字节码所对应的解释程序通常 

只有1—5条C语句,对应的机器指令通常也只有几条到十几 

条。在这种情况下,Switch-Case的解释执行过程所增加的额外 

开销相当可观。从机器指令的角度来看,Switch-Case的开销包 

括:①一次访存操作,读入pc指向的字节码;②pc加1操作; 

③对字节码的值进行边界检查;④一次访存操作,查找字节码 

在Switch.Case跳转表中对应的程序段人FI;⑤一次跳转操作 

到对应的Case程序段;⑥在Case程序段执行完毕后,再进行 

一次跳转操作,回到循环开头。可以看出,Switch-Case的开销 甚至超过了某些字节码解释程序自身的开销。这种开销累积 

起来,对执行效率的影响相当大。 

2适合移动通信设备的Direct Threaded Interpreter 

优化技术 

基于解释运行的优化技术主要包括Threaded Interpre- 

ter 、Direct Threaded Interpreter 和Inlined Threaded Interpre. ter J。有实验表明Is]:Threaded Interpreter与Switch-Case解释 

器相比性能有一定提高,但提高幅度有限,约7%一10%;In- 

lined Threaded Interpreter与Switch—Case解释器相比性能有很 

大提高,约150%一300%,但内存占用太大;而Direct Threaded 

Interpreter较折中,与Switch.Case解释器相比,性能提高约 

40%一100%,同时保持较少的内存占用。因此,本文主要考虑 

Direct Threaded Interpreter。 Threaded可译为线索化,是指解释器对相邻字节码的解释 

执行过程,通过一定的线索直接联系在一起,而不像Switch- 

Case那样,每解释完一条字节码都要重新经过由Switch进行 

解释分发。Direct Threaded Interpreter可以被译为直接线索化 

解释器。 

Direct Threaded Interpreter的核心思想为:解释器在运行字 

节码之前把字节码数组翻译为直接包含字节码对应解释程序 

人口的Threaded Code数组。在解释运行时不再访问原来的字 

节码数组,而是直接访问这个Threaded Code数组,只读人对应 

的处理程序人口地址。 

从字节码数组到Threaded Code数组的翻译过程如图2所 

示。变换时,在Threaded Code傲组中,将字节码操作码变换成 

对应处理程序的人口标号地址,操作数直接复制。其中, 

&&BYTECODE—LABEL表示对Bytecode对应的解释程序入FI 

标号BYTECODE—LABEL寻址。 

图2翻译过程示意图 

Direct Threaded Interpreter的工作过程为:一个字节码解释 执行完毕后,使pc指针指向Threaded Code数组中下一条字节 码解释程序入FI标号地址。使用goto pc语句直接跳转到下 

一条字节码对应解释程序人FI处执行,执行完后使pc指针指 

向再下一条。如此往复,直到程序结束。Direct Threaded Inter- 

preter工作过程的伪码如下: 

/ 字节码定义 / #define OPCODE一1 0 #define OPCODE_2 1 #define OPCODE 3 2 

/}字节码数组}/ uint8 bytecodes[]:{ OPCODE—.1, OPCODE.2, OPCODE 3, 

}; /}Threaded Code数组,包含字节码解释程序入口地址}/ void*threaded—codes[sizeof(byteeodes)]; threaded—codes[0]=&&OPCODE一1一LABEL; /}对应bytecodes[0]:OPCODE一1}/ threaded—codes[1]=&&OPCODE_2一LABEL; /}对应byteeodes[1]:OPCODE_2}/ threaded_codes[2]=&&OPCODE一3一LABEL; / 对应byteeodes[2]=OPCODE_3}/ 

void*tc—pc=&threaded_codes[0]; /}指向Threaded Code数组的指令指针}/ g0to*te_pe++; OPCODE一1一LABEL:/}OPCODE一1解释程序入口标号 / interpret A; ’ g0to*te_pe++; OPCODE 2一LABEL:/}OPCODE_2解释程序入口标号}/ interpret B; goto*te_pe++; OPCODE 3一LABEL:/}OPCODE_3解释程序入口标号}/ interpret C; g0to*tc_pc++; 

与Switch.Case相比,Direct Threaded Interpreter省掉了以 

下的操作:①每条字节码解释完毕后,到Switch的跳转指令;② 

读人pc指向的字节码;③Switch在查找跳转表之前对字节码