一种Java字节码静态调整的方法及应用_第1页
一种Java字节码静态调整的方法及应用_第2页
一种Java字节码静态调整的方法及应用_第3页
一种Java字节码静态调整的方法及应用_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、    一种Java字节码静态调整的方法及应用        蒋 凡,杨建国 时间:2008年05月14日     字 体: 大 中 小        关键词:        摘要:关键词: Java J2ME JVM 多维数组 Java字节码J2ME广泛应用在嵌入式系统中,其中

2、有不少基于多维数组的运算1。而Java语言的以下两个机制是制约这类运算效率的瓶颈。(1)Java用包含数组的数组来存储多维数组,而不同于CC+使用一块连续的空间进行存储,如图1所示。对于一个n维数组,当需要访问其中的某一个元素时,总共需要n+2次访问堆中的对象。第1和第2次访问该数组所属类的对象和数组对象;第3到第n+1次逐级访问代表每一维的数组对象;最后1次才能到达所需要访问的数组元素。如果相邻两次访问数组的元素不属于同一维,则很可能导致缓存失效,从而降低运算效率。(2)Java中采用了严格的异常机制,以保证在发生异常之前的运算都遵从用户程序。在进行多维数组访问时,要对每一维的下标进行空指针

3、检查和下标越界检查,并在有异常发生时进行相应的处理。这一机制从两个方面影响了程序的运行效率:捕获和处理异常需要占用大量的运算;阻止了代码优化,特别是影响了广泛应用于多维数组访问的循环代码的优化2。因此,需要通过改变J2ME中多维数组的存储和访问方式或者改变异常机制来改进J2ME程序的运行效率。1 已有的解决方案34。这一方案需要额外的内存空间来完成存储结构动态调整,同时需要操作系统对缓存失效率进行实时监测,实施起来有一定困难。(3)修改Java虚拟机。该方案通过修改Java虚拟机来提高效率。其策略是去除多维数组操作中进行的指针有效性检查和数组下标越界检查5。由于不同的嵌入式系统所使用的Java

4、虚拟机不同,所以需要对不同系统上的Java虚拟机做相应的修改。可见,以上三种解决方案对于J2SE来说都是可行且高效的,但对于J2ME而言就不是这样。本文提出了一种在可行性和高效性之间折衷的解决方案,并实现了一种静态调整Java字节码的工具原型。2 静态调整方法及实现本文提出的方法旨在降低缓存失效率,避免JVM对空引用的检测和异常处理,从而提高多维数组运算效率。通过静态调整Java字节码,使其被JVM装载之后,使多维数组能保存在一块连续的内存区域。这样,对多维数组的引用就在一个循环过程中始终处于缓存内,不需要在每次使用时进行空引用和异常检测。2.1 调整规则首先声明用同等容量及类型的1维数组代替

5、原多维数组,从而在运行时获得JVM堆中一块连续的存储空间。同时修改所有对多维数组的引用。当把一个d维数组转化为一个1维数组时,对数组中的每一个元素需要使用2×d个变量来访问:1个变量A包含该数组的引用;一个(d-1)维的向量w记录原数组前(d-1)维的权值,向量w中的第m个值标明原多维数组第m维空间的大小;另外一个d维向量i,记录所访问元素在原多维数组中的下标值。令M代表指向原多维数组的引用,wm代表向量w中的第m个元素值,in代表下标向量i的第n个值,则M所指向的多维数组中的一个元素可以通过如下表达式进行访问:Mi0i1.id=Aw0*i0+w1*i1+.+wd-1*id-1+id

6、2.2 调整过程2.3 应用举例为使说明简单明了,以程序1为例说明整个调整过程。程序1展示了按列逐个访问2维矩阵元素的代码。首先处理字节码常量池部分。用一个一维数组定义取代原有的多维数组定义。处理前后字节码如代码片断1和代码片断2所示。程序1intx=new int100100;int tmp=0;for(int i=0;i<100;i+)for(int j=0;j<100;j+)tmp+-xji;代码片断1:01 00 01 78 const#6=Asciz x;01 00 03 5B 5B 49const#7=Asciz I;0C 00 06 00 07 const#16=Na

7、meAndType #6:#7;代码片断2:01 00 01 78const#6=Asciz x;01 00 02 5B 49 const#7=Asciz I;0C 00 06 00 07 const#16=NameAndType #6:#7;然后处理数组初始化。使用1维数组初始化过程取代原多维数组初始化。包括数组容量计算、去除冗余代码、修改相关函数和代码属性。处理前后字节码如代码片断3和代码片断4。代码片断3:10 64 bipush 10010 64 bipush 100c5 00 02 02 multianewarray #2,2;b5 00 03 putfield #3;代码片断4:1

8、1 27 10 sipush 10000bc 0a newarray intb5 00 02 putfield #3;最后处理多维数组实例的引用。在方法内部,对多维数组的引用,只需修改其下标计算过程和由此引起的循环指标变化。代码片断5和代码片断6分别列出了程序1所示代码中两层for循环的字节码。代码片断5:10 64bipush 100a2 00 2d if_icmpge 4503 iconst_03d istore_21c iload_210 64bipush 100a2 00 27 if_icmpge 392a aload_059 dup代码片断6:10 64 bipush 1003eis

9、tore_302 00 35 if_icmpge 53ldiload_31ciload_2 10 64 bipush 10010 64 bipush 100a2 00 2fif_icmpge 4764isub84 01 64iinc 1,1003cistore_12aaload_003iconst_059dup经处理,字节码大小和整体结构没有发生变化,且提高了运算效率。3 实验及结果分析参考文献1 F Catthoor,S Wuytack,E E Greef et al.Custom memory management methodology-exploration of memory org

10、anization for embedded multimedia system design kluwer.June 19982 Mikel Lujan,John R Gurd,T L Freeman et al.Elimination of java array bounds checks in the presence of indirection. Technical Report CSPP-13,Department of computer science, university of manchester,February 20023 J E Moreira,S P Midki_,

11、M Gupta et al.The Ninja project.Communications of the ACM,2001;44(10)4 F Li,P Agrawal,G Eberhardt et al.Improving memory performance of embedded Java applications by dynamic layout modifications.In:18th International Parallel and Distributed Processing Symposium(IPDPS04)-Workshop 5,2004:1595 R Bodik,R Gupta,V

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论