J2ME应用程序内存优化三招

2016-02-19 13:42 0 1 收藏

今天图老师小编要跟大家分享J2ME应用程序内存优化三招,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - 编程语言 】

out momory 一阵天旋地转内存又溢出了。在手机上这种痛苦经常都有,套一句俗话在手机上用内存必须勒紧裤腰带。虽然现在pc内存上G都不希奇,可是在手机上却只能以K来记,可能某位同志会马上跳出来说也有上M的,记住中国还不富大多数手机都是低端手机。 !-- frame contents -- !-- /frame contents -- 写手机程序让我仿佛回到了dos时代(自我安慰一下那个时代也炼出了不少高手说不定我是下一个)。言归正传做内存优化可以归结为以下几种方法。代码优化,图片优化,第三方工具优化等…
  
    一.代码优化
  

  内存会溢出肯定和代码逃不了关系,99.99%学Java的人都知道垃圾回收器是java的一大优点并据此来嘲笑C++。显然这个特性为代码编写者省了不少事,但这个特性却带来了不少隐患。举个例子在游戏当中经常有不同场景的切换,如从游戏逻辑退到主菜单逻辑,对游戏逻辑对象的态度很多人会选择忘记等待垃圾回收器来收尸。乍看之下似乎并无不妥垃圾回收器会来善后。实际上垃圾回收器并非实时的,它不像C++的Delete语句马上释放不用的内存。当从游戏逻辑切换到主菜单逻辑这时两个对象同时存在很可能这时内存就不够用了。读到这里很多人会发现实际上垃圾回收器在j2me上并不怎么好用,从一个角度上来讲在j2me上所有垃圾必须由手工释放,除简单类型以外所有对象都必须显式地置空例如 imgs=null; 实际上java提供了一个不错的工具用来查找内存溢出,java.lang.Runtime.freeMemory() 。它可以返回当前的剩余内存数,将它适当的安放在代码中可以有效的监测内存使用状况。很大一部份的j2me程序员之前都是从事pc软件开发工作,充裕的内存掩盖了许多写代码的不良习惯。如下所示:
  
  //a 不为空
  
  a=new Logic();
  
  很多人可能对此有异议,他们会认为新的对象会把旧的对象冲掉并且释放内存。这里面包含两个问题:1. 该段代码是先创建对象然后再进行赋值操作的,也就是说在这期间有两个对象同时存在这就很可能会产生溢出。2. 这样做也会妨碍垃圾回收器的工作
  
  较好的写法如下:
  
  a=null;
  
  a=new Logic();
  
  虽然麻烦了点但在j2me中还是必要的。接着看下例。
  
  drawString("游戏时间:" + time ,50,50,Graphics.LEFTGraphics.TOP);
  
  "游戏时间:" + time 很完美在paint()方法当中每次都被刷一遍显示在屏幕上。危机往往隐藏在漂亮的外表,该语句会引起新的内存重新分配来存储 "游戏时间:" + time 而显示完以后又必须由垃圾回收器释放,用了双倍时间,并且轻易发生内存溢出。依此类推在重复执行的方法里应尽量避免重复定义对象。与paint()方法类似在循环里也有类似的情况存在。
  
  把所有对象的初始化放在构造函数里想必是再正当不过了,大多数人通常的做法是把当前逻辑所要用到的资源通通初始化完毕。
  
  很大一部份的内存溢出都是发生在构造函数中。内存使用的高峰期都是在构造函数中所以避开这个高峰能有效的防止溢出。建议最好的办法是第一次使用时初始化。如下所示
  
  if (img==null){
  //初始化
  }
  
  现在做游戏很多时候都需要地图数组,声音数组,还有一些其它资源这些资源很多可以放在代码中也有的可以放在文件当中。
  
  强烈建议将这些资源放在文件中需要时在load进来。这些资源文件假如放在代码中则会占用不小的代码段空间,而代码一般是程序一运行就装载到内存当中。
  
  除上面列举的方法外还有一些大家所熟知的顺便一提, 比如关闭没用的rms ,关闭没用的网络连接,关闭没用的流。正确地停止线程。良好的程序架构减少代码偶合性也是一个不错的方法,无论在代码调式,内存释放都可以做到非常清析。
  
    二.图片优化
  
  j2me的内存杀手无疑非图片莫属,一张3k的图片可以占用20多k的内存不信大家把load前后的内存剩余打印出来对比看看。所以防止内存溢出最直接的办法就是从图片入手。
  
  1.图片压缩: 多数人马上会想到这个办法。不错这个办法是最有效的。在Photoshop里图片制作完成后不要选择 "存储为",而是选择 "存储为 web 所用格式" 可以根据里面的选项进行压缩,非凡是颜色这一项越小越好不过相应的图像会有所失真。

来源:https://www.tulaoshi.com/n/20160219/1604998.html

延伸阅读
我们将从定义 J2ME 开始,从最简单的J2ME 是什么开始讲起。然后讨论它的总体架构并学习 J2ME 目标设备。作为架构讨论的一部分,我们将提供有关简表和配置的概述。同时我们会简要介绍打包和配置 J2ME 应用程序过程中的一些注重事项。 J2ME 是什么? Sun Microsystems 将 J2ME 定义为“一种以广泛的消费性产品为目标的的高度...
在J2ME中基于UDP协议编程一文中介绍了如何使用Datagram和DatagramConnection来开发应用程序,本文将主要讲述在MIDP2.0中使用ServerSocketConnection和SocketConnection来开发联网应用程序。TCP协议是可以保证传输的质量的,这也是他和UDP的一大区别。由于以上谈到的四个类都属于GCF,他们在程序编写方面也非常相似,通常我们在Server端的某个端...
Command对象 发信站: 北大未名站 (2001年10月20日20:33:56 星期六) , 站内信件 在前面我们其实已经使用过Command对象了。J2ME的事件系统比较非凡,你必须首先定义一系列的命令,然后注册到容器对象中,例如(Form、Alert、List、TextBox),再设定命令监听者 ,编写好commandAction()方法即可。当系统发送某个命令,便由commandAction...
不知道主题为"J2ME中的内存泄漏"是否妥当,不过在J2ME中假如处理不好资源的创建和释放问题,也会出现类似在CC++中的内存泄漏现象。 J2ME中最常使用的资源无非是图片和声音。为了提高游戏的运行速度,我们通常把它们声明为全局变量,又由于手机的内存的关系,我们不能把这些资源同时加载进内存,所以我们会在使用的时候导入资源(创建对...
有几个想学J2ME的朋友问过我这个问题。我想这个问题可以有两个答案。 J2ME是简单的。 !-- frame contents -- !-- /frame contents -- 说其简单,更主要的原因是J2ME开发使用的是Java,离开平台技术范畴(J2SE,J2ME,J2EE),Java语言本身是简单的,或者说“简洁”更为强大。比起C++的程序代码来说,Java Code让人看起来更舒适,也更直观。 ...

经验教程

125

收藏

89
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部