Java程序的优化 Java程序的优化

Java程序的优化

  • 期刊名字:青海师范大学学报(自然科学版)
  • 文件大小:702kb
  • 论文作者:张青
  • 作者单位:青海师范大学
  • 更新时间:2020-09-29
  • 下载次数:
论文简介

2004年青海师范大学学报(自然科学版)2004第4期Joumal of Qinghai Normal University(Natural Science)No.4Java程序的优化张青(青海师范大学计算机系,青海西宁80008)摘要:本文通过使用 Javap对Jau 语言的字节代码进行分析找到程序中产生瓶颈的原因,给出程序的优化方法.关键词:字节代码;优化;程序; Jou中團分类号:1TP312JA文献标识码:A文章编号:1001 - 7542(200)04-0042 -03Jax是-种字节编码的语言,用Jax编写的源程序通过Jarac编译后,生成同名可执行的字节代码(lass)文件,这种类型的文件无法阅读其内容.了解源程序转换为字节代码的原理,可为编程人员编写出高效程序提供帮助.将字节代码文件反编译为文本文件有两种方法:- -是Jax语言提供的Jaxap,该工具只能将数据区使用、方法及类的引用部分反编译为文本文件;二是借助于某些工具,查出Jaxap无法辨析的错误或反编译出全部的字节代码内容,这些工具需查找软件及使用说明,不如Jaxxp 直接简单易操作.本文通过使用Jaxap 工具,分析其产生的文本文件的内容,找出程序执行产生瓶颈的代码部分,使用优化方法对程序进行改进,以提高程序执行效率.1优化问题分析1.1 Jaxa分解器一 Jaxxp以下给出Jaxxp 的使用方法及说明:Method Test()public class Test0 aload_0public static void main( String args[])1 inwokepeial #1 < Method jowa. lang. 0bjeat()>{ Sysem. out . printIn(“hllo!");| }利用Jaxp的输出格式: Jawapc Test 将字节代码转Mehad woid man(axa. lang . Sring[])换为可阅读的文字,显示结果如下:0 getstatic #2< Field jawa . io . PrintStream out >Compiled. from Test .jaua3 lde #3 < String" hello!" >public class Test extends java . lang . Object |5 imwkeiral #4 < Mabod woid pindn(ja . lang . Sring)>public Test();8 retum .public static woid main(jav . lang . String[]);}在main()方法的中,第一列表示指令的偏移量,第一条指令以0开始,紧跟偏移量后是指令助记符, getstatic 指令将一个静态字段#2 < Field java . io . PrinInSream ou >压人堆栈,查看字节代码,其中的成员信息(字符串常量“hllo!" )并没有直接嵌人指令中,指令中存放的是常量在常量池的索引值,该值从1开始,这样做的目的是为了减少字节代码指令的长度.常量池用于存放与类相关的常量,其中包括类名、变量名、常量值、方法名等,常量池是一个变长项的数组,每个常量占用一个项 ,根据常量类型的不同,每项的存储格式也相异.在这个例子中,成员信息位于常量池中#2位置.“lde" ( lod constant )为装人常量指令,它是将常量“hello !"压人堆栈.“inwokeirtual'’指令调用printIn方法.中国煤化工收稿日期:2004-01-02作者简介:张青(1965 - ),女(汉族),陕西南郑人,青海师范大学讲师.MYHCNMHG第4期张青: Jaxa程序的优化431.2. 使用String类Java语言是一种面向对象的程序设计语言,它是由包组成,各包含许多现成类,这些现成类为我们提供了象String和SringBufer这样的类.通过使用这两个类生成的对象(或实例) ,对它们进行分析.下面的两行语句,是完成由String 类生成一个| //调用字符串缓冲的构架器( Constructor);name对象并输出字符串.20 aload_ 1 //保存该字符串缓冲到数组中String name = nevo Sring(“ZhangQing");(从位置1开始);System . out . printIn( name +" is my name );21 inolkevirtual #{经过Jaxap产生的代码如下:< Method jaxn . lang. SringBufer append (jana . lang.0new#2Sring)>//生成新的字符串new String(STR1);//以SIR 1为参数,调用字符串缓冲( SringBufe)3 dup//复制该字符串;类中的append 方法;4 lde #3 < String." ZhangQing" >24 lde #9 < String“ is my name." >//加载字符串常量“ZhangQing"(STR2);//加载字符串常量“is my name"( STR3);6 inwokespecial # 426 inohevirtual #< Method java . lang . String(java. Lang . String)>< Method jxa. lang . SringBufer append (jaxn. lang .//调用字符串的构架器( Constructor);Sring) >9 astore. 1//保存该字符串到数组中(从位置0开| //以STR 3为参数,调用字符串缓冲( Sringufer)始);10 getstatic #5 < Field jaxa . io. PrinuStream out >29 inwohevirual # 10 < Method jaa. 1ang .//从jaa. io. PrinStreamn 类中得到静态的out变| String to String()> //对于STR ,BUF.1执行toSring量;命令;13 new #6 < Class java . lang . StringBufer >32 inwokevirtual # 11//生成新的字符串缓冲变量< Method woid prinln( java . lang . String)>new StringBufer( STR - BUF_ 1);//调用out变量中的println方法,输出结果16 dup //复制该字符串缓冲变量;35 retum17 inokepecil #7 < Method jaxa .1ang . SringBufer()>这两行代码生成了STR 1, STR2, STR3, STR4和STR BUF_ 1五个对象变量,八种调用的方法:两个new、两个inokepecial和四个inokevirtual..3 使用SringBuyfer类将_上述两行语句改为由Srigbufer 类生成的对象:StringBuyfer name = new StringByfer(”ZhangQing");System. out . prinIn( name . append(“is my name ."). loSring());再由Jaxp反编译,代码如下:0 new #2 < Class java . lang . StringBufer >//调用字符串缓冲的构架器( Constructor);ner StringBufer( STR BUF. 1); .9 astre. 1 //保存该字符串缓冲到数组中3 dup //复制该字符串缓冲变量;4 lde #3 < String“ZhangQing">10 getst中国煤化工Stream out >//加载字符串常量“ZhangQing"(STR 1);//从janl| YHCNMHG的out变量;13 aload_1 //加载 STR .BUF_I;< Method jaxa . lang . StringBuyfer(jaxa. lang. String) | 14 lde #6 < String" is my name.">44青海师范大学学报(自然科学版)2004年//加载字符串常量“is my name"( STR2);tring()>16 inwokerirtual #7//对于STR BUF_ 1执行toString 命令( STR3);< Method joxr. lang. SringBufer ppend (jan, lang.22 inwokerirtual #9String)>< Method xoid prinln( jawa . lang . String)>//以STR2为参数,调用字符串缓冲( StringBufer)//调用out变量中的println方法,输出结果.实例中的append 方法;25 retum19 inoevirtual #8 < Method java. lang . String toS-经过改进后的代码只生成了四个对象变量: STR1, STR2, STR3和STR ,BUF.1,五种调用的方法:一个new、-一个inwokespecial 和三个inwokevirtual.2优化方法比较上面的两个类使用结果,用StringBufer类要比String类生成的对象和方法少.由于系统要生成对象并进行方法的调用,还需对这些对象进行垃圾回收和处理,且生成的类实例都存放在堆中,堆(hep)是内存中的一块区域,用来存放所有类实例和数组运行时的数据,在堆中的所有类实例、类的超类(父类)要进行初始化,同时还要调用类以及每个超类的构架器( Constrnctor) ,不但程序运行时间长,还要占用相当的系统资源.我们可采用以下的方法进行优化,以便提高程序运行速度.①将对象设置为静态变量(StaticClassVariable) ,因定义的静态变量,可被其它的实例共享:②对于象String这样类,因String类是处理那些值不发生改变的对象,重新生成- -个新的对象实例,比修改已经生成的对象实例更能加快程序运行:③在Jaa语言中很多类都有它的默认空间,如StringBufer类,因StringBufer 类用于那些值发生变化的对象,它的默认空间为16个字符,若使用大于16个字符,需初始化:④对于一些使用频率不高或生命周期短的对象或变量将它们放人对象池中,对象池用于存储类名称、方法和字段名称及串常量的存储区.管理一个对象池的开销要比频繁的生成和回收对象的开销小的多;⑤在对象的作用范围内进行初始化.3讨论除上述文中涉及到的优化方法外,还有一些象异常( Exceptions )处理,产生异常现象- -般用try/ cach语句处理,在-些即可用try/ catch语句也可用if, while等逻辑语句处理异常的场合,使用后者更有益.从系统开销的角度讲,使用局部变量、不在同一个类中过多用函数或方法( get或set )来设置参数或调用变量,不在循环中生成同一个变量或 调用同一个函数(参数与变量- -样), 使用象staic ,final , prioate 这样的关键以及用System. araycopy( )来复制批量数据等方法,都可用来优化程序.参考文献:[1]耿样义.Java 实用教程[M].北京:清华大学出版社,001.[2]吴晓东. Java程序设计基础[M].北京:清华大学出版社202.0The optimization questions of Java design programmesZHANG Qing(Computer Deatment of Qinghai Nomal Univerit Xinino 81008 China)Abstract: By analying the bytecode of Jaxa language, ThisMH中国煤化工a why botle-neck comes into being in the programmes , and also gives some optiCNMHGmes.Key words: byecode; optimization; programmer; Jaxa

论文截图
版权:如无特殊注明,文章转载自网络,侵权请联系cnmhg168#163.com删除!文件均为网友上传,仅供研究和学习使用,务必24小时内删除。