out momory 一阵天旋地转内存又溢出了。在手机上这种痛苦经常都有,套一句俗话在手机上用内存必须勒紧裤腰带。虽然现在pc内存上G都不奇怪,可是在手机上却只能以K来记,可能某位同志会马上跳出来说也有上M的,记住中国还不富大多数手机都是低端手机。写手机程序让我仿佛回到了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.LEFT|Graphics.TOP);
"游戏时间:" + time 很完美在paint()方法当中每次都被刷一遍显示在屏幕上。危机往往隐藏在美丽的外表,该语句会引起新的内存重新分配来存储 "游戏时间:" + time 而显示完以后又必须由垃圾回收器释放,用了双倍时间,并且容易发生内存溢出。依此类推在重复执行的方法里应尽量避免重复定义对象。与paint()方法类似在循环里也有类似的情况存在。
把所有对象的初始化放在构造函数里想必是再正当不过了,大多数人通常的做法是把当前逻辑所要用到的资源通通初始化完毕。
很大一部份的内存溢出都是发生在构造函数中。内存使用的高峰期都是在构造函数中所以避开这个高峰能有效的防止溢出。建议最好的办法是第一次使用时初始化。如下所示
if (img==null){
//初始化
}
现在做游戏很多时候都需要地图数组,声音数组,还有一些其它资源这些资源很多可以放在代码中也有的可以放在文件当中。
强烈建议将这些资源放在文件中需要时在load进来。这些资源文件如果放在代码中则会占用不小的代码段空间,而代码一般是程序一运行就装载到内存当中。
除上面列举的方法外还有一些大家所熟知的顺便一提, 比如关闭没用的rms ,关闭没用的网络连接,关闭没用的流。正确地停止线程。良好的程序架构减少代码偶合性也是一个不错的方法,无论在代码调式,内存释放都可以做到非常清析。
二. 图片优化
j2me的内存杀手无疑非图片莫属,一张3k的图片可以占用20多k的内存不信大家把load前后的内存剩余打印出来对比看看。所以防止内存溢出最直接的办法就是从图片入手。
1.图片压缩: 多数人马上会想到这个办法。不错这个办法是最有效的。在photoshop里图片制作完成后不要选择 "存储为",而是选择 "存储为 web 所用格式" 可以根据里面的选项进行压缩,特别是颜色这一项越小越好不过相应的图像会有所失真。不要认为这样就完了。
实际上该图片还可以再次压缩,在网上有许多类似的工具。推荐一款可以压缩png格式的软件 xat.com Image Optimizer 效果不错。经常都有 70% 的压缩率且图像不会失真。
假如你有多张规格一样的图片,那么建议你把它做成一张长条图片。有两个原因:
1、 这样节省存储空间和内存空间。大家可做个试验将10张图片的内容放在一张当中对比看看文件大小有没有变化。
2 、10张图片需要10个image 对象需要进行10次io操作浪费时间不说还浪费内存。当笔者发现这个好处时兴奋地把所有图片都存成一张,吱地一声内存又溢出了...原因想必大家也知道!!图片太大了不要把不同界面的图片整合在一起否则经常会得不偿失。
作图时还有一些细节需要注意,颜色数量,分辩率,图像模式(最好是索引颜色),画布大小都会影响到图片大小。
三. 工具优化
谁都知道混淆器是用来保护代码的以加大反编译的难度(个人认为这是在嘲笑程序员的智商)。实际上用它来优化程序也是不错的选择,至少有两点好处:
1、 压缩程序大小。一个60k的程序经常可以压掉10k左右。10k的空间对于写低端手机的程序员简直是雪中送碳,多少超过64k限制的游戏都受过它的恩惠;
2、节省内存空间。用脚去想也想得出来代码少了内存里的代码段自然就短了
原文:http://tech.163.com/05/0527/11/1KONACFE00091589.html
分享到:
相关推荐
### J2ME应用程序性能优化的探讨 #### 引言 随着移动互联网的快速发展,Java 2 Micro Edition(简称J2ME)作为一种适用于嵌入式设备和消费性电子产品上的Java平台,为开发者提供了丰富的开发工具和环境。然而,...
**基于Eclipse环境的J2ME应用程序开发** Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式设备和移动设备,如手机、智能家电等。Eclipse作为流行的Java开发集成环境,提供了强大的工具支持,使得...
在J2ME(Java 2 Micro Edition)开发中,代码优化和内存优化是至关重要的环节,因为资源有限的移动设备需要高效且节省...通过阅读压缩包中的文档和教程,开发者可以深入了解这些技术,提升J2ME应用的性能和用户体验。
这些IDE提供了编写、编译、模拟和部署J2ME应用程序的工具。安装后,需要配置J2ME SDK,并创建新的J2ME项目。 3. **基础语法与编程结构** J2ME基于Java语言,因此熟悉Java基础至关重要。包括类、对象、继承、封装、...
由于资源限制,J2ME应用程序的性能优化至关重要。这包括减少内存占用、优化代码结构、合理使用线程以及避免不必要的网络请求等。 综上所述,基于J2ME平台的手机应用程序开发涉及了从基础的J2ME架构理解,到具体的...
在J2ME(Java 2 Micro Edition)平台上开发应用程序时,由于硬件资源有限以及设备的多样化,优化程序性能显得尤为重要。以下就是十个针对J2ME程序优化的小方法,旨在提高程序运行效率,减少内存占用,提升用户体验。...
MIDP定义了用户界面、网络访问和文件存储等核心功能,而CLDC则提供了运行J2ME应用程序所需的虚拟机环境和基本类库。 在J2ME开发中,你将接触到以下几个关键概念: 1. **MIDlet**:这是J2ME中的应用程序单位,类似...
- **Java应用管理**:MIDlet类是J2ME应用程序的基本单位,它负责应用程序的生命周期管理。 ### 4. 程序结构 J2ME应用程序通常由一个或多个MIDlets组成,每个MIDlet都包含一个主类,继承自MIDlet。MIDlet类有三个...
完成的J2ME应用程序通常以JAR(Java Archive)和jad(Java Application Descriptor)文件形式分发,用户可以通过WAP(无线应用协议)下载或通过应用商店安装。 总的来说,J2me版摄像头拍照程序是一个集成拍照、...
学习J2ME应用开发,你需要熟悉MIDlet的概念,它是J2ME应用程序的基本单元,运行在MIDP环境中。MIDlets有生命周期,包括初始化、显示、暂停、恢复和终止等状态,开发者需要理解如何管理这些状态来确保应用的正确运行...
2. **MIDP**:讲解MIDP的组件,如 MIDlet(J2ME应用程序的基本单元)、用户界面组件(如Canvas和Form)、以及如何使用MIDP API进行应用程序的生命周期管理。 3. **CLDC**:解释CLDC的角色,如何处理内存限制,以及...
3. **内存优化**:通过有效管理内存分配和释放,减少内存碎片,提高内存使用效率。 #### 技术细节 ##### 代码优化 - **循环展开**:通过将循环体中的操作重复写出来以减少循环次数,从而提高执行速度。 - **条件...
标题中的"j2me小程序"指的可能是一些简单的J2ME应用程序,这些程序通常包含基础功能,如欢迎界面和短信发送。在移动设备上,这类小程序有助于提升用户体验,提供基本的交互服务。 **欢迎界面**是任何应用程序的第一...
此外,MIDlet Suite是J2ME应用的基本打包形式,包含了多个MIDlets(J2ME应用程序)以及相关的资源文件。 **J2ME程序设计实例** 《J2ME程序设计实例教程》中可能涵盖了各种实际应用场景,如游戏开发、数据通信、...
J2ME应用程序通常基于MIDP(Mobile Information Device Profile)和CLDC(Connected Limited Device Configuration)。MIDP提供了用户界面组件和网络功能,而CLDC则定义了基础的Java环境。示例中的应用程序可能涵盖...
J2ME是Java的一种轻量级应用框架,主要用于开发移动设备、嵌入式系统等资源有限的环境中的应用程序。这款赛车游戏展现了J2ME在游戏开发领域的潜力,为开发者提供了学习和研究移动游戏编程的良好实例。 首先,我们要...
为了充分优化J2ME应用程序的性能,开发者还需要关注内存使用和应用程序的生命周期管理。MIDlet是J2ME应用程序的基本组成部分,它具有生命周期管理方法,包括startApp()、pauseApp()和destroyApp()方法,用于处理应用...
1. **MIDlet类**:J2ME应用的核心是MIDlet,它是运行在MIDP设备上的Java应用程序。一个MIDlet通常包含三个方法:`startApp()`, `pauseApp()` 和 `destroyApp()`,分别对应应用的启动、暂停和销毁状态。 2. **用户...
J2ME应用需要考虑资源限制,因此性能优化至关重要。这包括减少内存分配、优化绘图操作、使用位图精灵(Bitmap Sprites)以及有效利用线程等技术。 通过深入研究这个J2ME经典程序代码库,开发者不仅可以学习到J2ME...