龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

J2ME应用程序内存优化的几种途径(1)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
开发 J2ME 应用程序时,out momory内存溢出这种痛苦经常经常出现,所以J2ME应用程序内存的优化是非常必要而必须的,这里向大家简单描述一下,相信本文介绍一定会让你有所收获。 J2M

开发J2ME应用程序时,out momory内存溢出这种痛苦经常经常出现,所以J2ME应用程序内存的优化是非常必要而必须的,这里向大家简单描述一下,相信本文介绍一定会让你有所收获。

J2ME应用程序内存优化

开发J2ME应用程序时,out momory内存溢出这种痛苦经常经常出现。要知道在手机上用内存必须勒紧裤腰带,手机是以K来计算的。写手机程序让人回到了8086时代。J2ME应用程序内存的优化是非常必要而必须的。

一.代码优化

内存会溢出肯定和代码逃不了关系,垃圾回收器是java的一大优点,显然这个特性为代码编写者省了不少事,但这个特性却带来了不少隐患。
举个例子在游戏当中经常有不同场景的切换,如从游戏逻辑退到主菜单逻辑,对游戏逻辑对象的态度,很多人会选择忘记内存的释放,就等着垃圾回收器自己来善后。但是实际上垃圾回收器并非实时的,它不像C++的Delete语句马上释放不用的内存。当从游戏逻辑切换到主菜单逻辑这时两个对象同时存在很可能这时内存就不够用了。

实际上垃圾回收器在j2me上并不怎么好用,在j2me上所有垃圾手工释放才比较直接有效,除简单类型以外所有对象都必须显式地置空例如 imgs=null; 实际上java提供了一个不错的工具用来查找内存溢出,java.lang.Runtime.freeMemory() 。它可以返回当前的剩余内存数,将它适当的安放在代码中可以有效的监测内存使用状况。
有一部份的j2me程序员写代码存在不良习惯。

例1: 

  1. //a 不为空  
  2. a=new menu(); 

这里面包含两个问题:

1. 该段代码是先创建对象然后再进行赋值操作的,也就是说在这期间有两个对象同时存在这就很可能会产生溢出。

2. 这样做也会妨碍垃圾回收器的工作

较好的写法如下: 

  1. a=null;  
  2. System.gc(); // 回收a以前引用的对象  
  3. a=new menu(); 

虽然麻烦了点但在j2me中还是必要的。

例2:

drawString(”游戏时间:” + time ,50,50,Graphics.LEFT|Graphics.TOP);
“游戏时间:” + time 很完美在paint()方法当中每次都被刷一遍显示在屏幕上。该语句每次运行时会重新分配内存来存储 ”游戏时间:” + time 而显示完以后又必须由垃圾回收器释放,用了双倍时间,并且容易发生内存溢出。依此类推在重复执行的方法里应尽量避免重复定义对象。与paint()方法类似在循环里也有类似的情况存在。

例3:

把所有对象的初始化放在构造函数里,大多数人通常的做法是把当前所要用到的资源通通一次初始化完毕。
很大一部份的内存溢出都是发生在构造函数中。内存使用的高峰期都是在构造函数中所以避开这个高峰能有效的防止溢出。
比较好的做法是第一次使用时初始化。如下所示 

  1. if (img==null){  
  2. //初始化  

现在做游戏都需要地图数组,声音数组,还有一些其它资源。
这些资源可以放在代码中也可以放在文件当中,但是建议将这些资源放在文件中需要时在loading进来。这些资源如果放在代码中则会占用不小的代码段空间,而代码一般是程序一运行就装载到内存当中。

除上面列举的方法外还有其他的小方法, 比如关闭没用的rms ,关闭没用的网络连接,关闭没用的流。正确地停止线程。良好的程序架构减少代码偶合性也是一个不错的方法。

精彩图集

赞助商链接