您的位置:首页 > 其它

J2ME手机开发之内存优化攻略

2012-01-30 18:06 253 查看
在C或C++开发流程中,内存溢出疑问可谓是经常让开发人员极其痛苦的事情,稍不留心疑问就产生,甚至引发隐含的漏洞产生。JAVA正是在C++的优秀品质中继承下来的产物,拥有垃圾回收机制是JAVA虚拟机在C++继承流程中进化的一个主要地点,垃圾回收机制能在对象没被运用之后的某个时间将对象执行回收,从而能使无用对象占据的内存得到释放。但是,这仅仅对有足够内存的Server服务器主机跟PC机上的虚拟机有用,对于内存极其珍贵的设备来说垃圾回收机制却显得有点无能为力,英雄无用武之地。虽然随着手机硬件的不断升级,智能手机中的手机内存以及CPU资源大大得到提升,但是目前用户手中的手机并不能普遍达到这种水平,因此在J2ME设计开发流程中我们须要很好的考虑到每一寸内存土地的运用。今天参考了有关资料,并对J2ME开发流程中的内存有关内容做个归纳,以添加对内存的运用有更好的理解。

一、程序内存情况分析

1、在运用 WTK中,我们可以调用工具中的Memory Monitor来查看程序的内存运用情况。

2、运用相对于的手机模拟器内存监视器来对程序运用内存执行 监视。

3、Runtime类提供了查看剩余内存的要领 freeMemory()。

二、程序内存占用分析

一个软件在运行流程中占据内存主要是程序代码和程序所运用的各类资源,包括文字文件资源、图片、音乐等多媒体资源。

而在JAVA虚拟机中,java代码最终是被编译成class文件的字节码形式并且随着程序的启动而加载到内存中,因此经过编译之后的字节码文件的容量大小,将会影响程序最终占用内存的大小,而字节码文件的大小则是由程序代码中类的个数、变量名称以及要领名的长度、字符串以及静态常量的长度和大小等因素决定的。

在手机使用程序中特别在游戏开发中,都须要运用各类的资源,使得游戏内存丰富多彩,而这些资源将是程序占据更多资源的原由。同样的,在游戏场景中,设计到很多对话内容,因此涉及到很多文字存储文件(运用文件存储而不是在程序中声明字符串的作用是在须要时候才读取内容,防止 过多字符串占据过大内存)。

声音也是一种极其占据内存的资源,因此在程序当中也须要对声效等资源的控制。

三、内存优化要领攻略

1、代码优化

尽量运用较短的变量名称和要领名称,减少类中成员变量跟成员要领的数量,多运用局部变量而少运用全局变量,减少程序总体的代码行数,在程序测试确定无错情况下可以去掉异常处理的try-catch语句,对常量跟字符串过多的程序中运用文件存储形式以运用时候再读取,对不运用的对象及时指向为null,对占据大内存的程序或资源的数据流读取运用后及时释放资源并运用 System.gc()要领回收垃圾资源。

2、图片优化

在图片运用中,我们通常运用图形压缩工具或算法对图片大小执行 压缩,但是这样的作用仅仅是较小了J2ME程序最终产生的JAR文件包大小,但不能减少图片在被运用时候对内存的消耗。据有关资料介绍,图片的内存在内存中的大小只跟图片被装载后的高度跟宽度有关,而跟图片本身体积大小无关,计算公式为内存占用量=宽*高*像素字节数。

因此在图片优化中可以运用减小图片的高宽、运用图片分割编辑工具对图片执行 分割,充分运用 图片的空间;在运用的时候才载入有关的图片,而在无用的时候及时销毁图片对象;对每一张图片声明一个对象变量。

3、声效资源优化

对声音采用字节流ByteArrayInputStream来建立 Player对象;在对声音对象的回收前停止声音的播放;其次在每次播放声音前先对声音对象执行 判断,如对象存在则先停止后再执行 播放。

4、有关字符串处理

对字符串的处理运用 StringBuffer来操作,因为运用要领 append时是同一个对象上的操作,而如果采用“+”操作字符串则会每次建立新的对象。

5、对循环的优化

尽量在for循环语句中将size或length等计算提取到循环外面,如下所示(对数组num{23,13,46,26,22,57}执行 排序):

int k = num.length;

for(int i=0;i<k-1;i++) {

for(int j=1;j<k;j++) {

if(num[i]<=num[j]) {

int temp = num[i];

num[i] = num[j];

num[j] = temp;

}

}

}

以上总结了下J2ME手机开发中的内存优化的一些内容,下面继续总结下在J2ME开发流程中的一些细节优化处理。优化的作用就是提高代码的执行效率,降低运行时的内存消耗,更好的适应各类内存类型的大小跟配置,以下内容将专门叙述有关代码优化的细节。

A、除法运算优化

在除法运算流程中运用移位操作比直接运用 "/"更具效率,如(a+b)/2优化后的代码为(a+b)>>1.

B、变量局部化

在声明变量时候,尽量运用局部变量去替代全局变量,局部变量的赋值性能高于全局变量,如下代码:

int sum; public void add(){ for(int i=0;i<100;i++) sum += i; } 优化后代码为: int sum; public void add(){ int temp = sum; for(int i=0;i<100;i++) temp += i; sum = temp;
}

C、多选择switch

在多选择情况下,运用 switch执行 判断而少用if-else来做判断,不但提高性能,而且提高代码可读性。

D、字符串声明

在字符串声明中,运用直接赋值比建立字符串对象好,比如String str = "test"; 比String str = new String("test");更节省内存,因为new本身建立了另一个字符串对象,从而添加了内存开销。

E、字符串判空

在判断一个字符串能不能为空情况下,运用判断字符串长度能不能为零,而不运用与""做比较,如运用 str.length==0而不运用 str.euqals("")。

F、StringBuffer对象

在运用 StringBuffer中,如果操作一个字符,运用 '',而不运用 "",如'a',而不是"a".

G、异常处理优化

在异常捕获处理代码中,可以运用对异常发生的情况先执行 判断,并执行当异常情况请有效代码来替代try-catch的异常处理。如下代码:

try{

a.do();

}catch(NullPointerException ex){

//异常处理代码

}

优化为:

if(a==null){

ruturn;

}else{

a.do();

}

H、内部类

运用内部类在某些时候带来一定优点,但是运用内部类会消耗更多的内存,因此尽量少运用内部类。

I、程序暂停与开始

在程序暂停pauseApp时候让无用的资源释放,而在开始startApp的时候获取资源,在程序停止destoryApp的时候释放所有资源。

J2ME中程序优化的十个小要领

 j2me程序由于其特殊的运行环境限定,所以优化就显得比较主要,以下是在学习j2me编程所收集的一些技巧和自身的心得。

  本文首要是表明 j2me平台上的特殊优化要领,与j2se重复的一些技巧就不再赘述了。

  1.显示图象时确定好你的fps,最好先做几次小实验,这样能让你在显示成效和运行速度上有比较好的平衡。

  2.GamaCanvas.getGraphics()每次都会产生一个全新的对象,但是对这些对象的操作都是对同一个graphics,所以仍旧只取一次供后面运用。

  3.让多个对象运用同样的监听器,比如让主MIDlet类实现CommandListener和ItemStateListener接口。

  4.思虑运用手机开发商提供的一些sdk,没人会比他们更明白他们手机,所以有些时刻能显著提高速度,特别是图片,视频运用方面。

  5.运用监视工具剖析 MIDlet的瓶颈,wtk和各个公司提供的开发包里都会有,能够找到程序的弱点。假如是在手机上,用timer测试你认为有能够的地点。

  6.运用 System.gc(),在无线程阻塞的情况下能够有效的缓解内存压力,但是有些公司不是太推选运用 (如nokia).sun的说法也是越低端的机子执行的越慢,总之,慎用吧。

  7.用固定的数组代替运用 Vector。

  8.图片的优化。思虑运用装备的规格,可能高分辨率的图片不必须显示的出来。

  9.不用的对象赋值为null,为更快的回收

  10.用混淆器处理你的类文件,防止反编译,还有一个好的副作用就是它减小class文件的大小,因为混淆器往往用较短的字符串代替原来的变量或要领名。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: