J2ME内存占用及优化方法

我想做过J2ME的人,特别是像我这样做手机游戏的,肯定会对OutOfMemoryError这个异常深恶痛绝,尤其是在老40这样变态的机型上,甚至对这个异常都产生了恐惧。还好我现在总算不做这个机型了,对那些仍然在为这个机型移植游戏的同志们感到同情。为了能够稍微缓解一下他们的痛苦,也为了广大J2ME的从业者和爱好者能尽量减少与该异常的见面次数,CoCoMo将把自己的经验分享一下。

首先了解一下分析内存占用的方法,一般有两种:模拟器自带工具和Runtime类方法。

模拟器自带工具:WTK貌似带了一个Memory Monitor,而且许多学者人士也夸夸其谈他的使用方法,但我不知道有多少人真正在用。就我对他的了解,首先运行他你的程序会慢的一塌糊涂,这对游戏开发者来说简直是无法忍受的。但我出于研究目的仍然让他跑了半个小时才发现原来他根本无法显示正确的内存占用量,我载入一张很大的图片后他的内存线好像只出现了微微的波动又停留在原位,呵,看来的确是拿出来秀的。我一般使用的是7210模拟器自带的内存监视器,模拟的很准,但唯一的缺点是内存太少,才200K。我也见某些人使用3220的模拟器监视内存,好像内存稍微大一点,我还没来得及尝试就再也不用为老40写程序了,庆幸。

Runtime类方法:我经常用这个语句System.out.println(Runtime.getRuntime().freeMemory());后来集成进了我的引擎,他能够显示当前剩余内存。不记得有多少次我用它在老40上来寻找内存占用峰值。

了解了分析内存的方法,来看看内存占用的罪魁祸首:程序和资源。

程序:类会被编译成class字节码文件随MIDlet的启动加载进内存,而且是一次性全部加入。也就是说MIDlet里类个数越多、单个类程序越长、类内字符串常量及数据越多,编译后的class文件就越大,载入后占用的内存也越多。我经常在MIDlet类的构造函数里用Runtime方法来查看MIDlet启动后整个程序占用内存量。

优化方法:

1.某些同志将MIDlet程序写成两个类来减少内存占用量,但是以牺牲Java的OOP特性为代价的。在程序比较大时这种弊端将尤为显见。而且CoCoMo曾经遇到过单个类过大,载入时间过长而违反百宝箱有关Logo 6秒时间限制的情形。因而我现在的程序加带引擎一般都是6-7个类。

2.尽量编写优雅的代码,减少函数数量,在程序发布时去掉try catch,最大限度的减少程序行数,这一般都是在老40上没有办法的办法,现在CoCoMo已经不靠这个来省内存了。

3.将数据及字符串写进文件,在用时方载入内存,不用时设为null。

4.I/O操作getClass().getResourceAsStream(file);、数据库操做RecordStore.openRecordStore(name, true);、声音创建Manager.createPlayer();、图像创建Image.createImage(file);会在短时间内占用大量内存且过后释放,如果MIDlet程序内存剩余量不足则会在这些函数频繁调用时发生内存溢出,产生所谓的内存峰值,尤其在老40上比较普遍。当你再次与讨厌的OutOfMemoryError碰面时,多用Runtime查找内存峰值发生位置并尽量将这些语句分开调用,并灵活运用System.gc()来及时回收。

资源:

图片:是占用内存的大户,尤其是手机游戏图片资源众多。对图片资源在内存中占用量的计算成为J2ME游戏开发者的经常性工作,CoCoMo来解释一下如何计算图片在内存中的占用量:

内存占用量=宽*高*像素字节数,其中像素字节数因机型而异。

例如一张64*64的图片在7210上的内存占用量=64*64*1.5=6144(字节)=6K、在S60上的内存占用量=64*64*2=8192(字节)=8K。像素字节数因机型而异,例如7210是4096色机型,也就是说用12位来表示一个像素,所以乘上1.5,而S60是65536色的机型,用16位来表示一个像素,所以乘上2。

优化方法:

有些人认为压缩图片可以节省内存,这种想法是错误的。根据上面的解释图片载入内存后只和宽高有关系,和图片数据量大小没有任何关系,压缩图片只能减少jar大小而不能减少内存占用量。

1.静态法:减小图片大小,宽高小了结果当然小了。根据这个思路出现了动画编辑器之类的工具,像gameloft的波斯王子,人物被分割后使人体的部位可以重用,各部位紧凑放置都是为了较少图片大小,充分利用图片中的每一寸空间。

2.动态法:减少同一时刻载入内存的图片数。CoCoMo曾经在火影武士项目中遇到过这种情况,当时有6种怪物,如果同时载入内存在老40上肯定爆掉了,但是每关只出现两到三种怪物,所以每一关只需要载入该关出现的怪物图片即可。现在想起来当时做这个项目在老40上溢出频出,真把我搞死了。

声音:声音也是比较耗用内存的资源,声音中音轨所占的byte会转化成字节流被载入到内存中。因而减少音轨所占byte即可减少内存耗用量。目前gameloft的做法是用声音转化工具将mid转化为ott,然后变为ByteArrayInputStream字节流来创建Player。

时间: 2024-10-06 04:48:20

J2ME内存占用及优化方法的相关文章

在Linux中可视化显示内存占用情况的方法

  物理内存不足对Linux桌面系统和服务器系统的性能影响都很大.当你的计算机变慢时,要做的第一件事就是释放内存.尤其是在多用户环境以及执行关键任务的服务器环境下,内存消耗会变得更加关键,因为多个用户和应用线程会同时竞争更多的内存空间. 如果要监测系统内各种资源的使用情况(比如说CPU或内存),图形化显示是一种高效的方法,通过图形界面可以快速分析各用户和进程的资源消耗情况.本教程将给大家介绍在linux下图形化分析内存使用情况的方法,使用到命令行工具是smem. 物理内存使用情况: RSS .

降低JRuby的内存占用的可能方法

JRuby的内存占用是比较高的,毕竟需要启动一个JVM以及构建抽象语法树等,一般同一个脚本的内存占用都是CRuby的几十倍甚至上百倍.记的Infoq上有过一个新闻是说sun跟东京某大学合作研究Ruby和JRuby的MVM,可以在几个VM之间共享解释器,可以在启动多个VM的时候大大降低内存占用.不过这个项目暂时没有什么消息,要想在实际中应用更是没影的事情.有无其他解决办法?今天看到IBM Developer的一篇文章,原来IBM JRE for the Java platform SE 5早就引入

提高Windows内存效率的优化方法

如何优化内存的管理,提高内存的使用效率,尽可能地提高运行速度,是我们所关心的问题.下面介绍在Windows操作系统中,提高内存的使用效率和优化内存管理的几种方法. 1.改变页面文件的位置 其目的主要是为了保持虚拟内存的连续性.因为硬盘读取数据是靠磁头在磁性物质上读取,页面文件放在磁盘上的不同区域,磁头就要跳来跳去,自然不利于提高效率.而且系统盘文件众多,虚拟内存肯定不连续,因此要将其放到其他盘上.改变页面文件位置的方法是:用鼠标右键点击"我的电脑",选择"属性→高级→性能设置

远程检测Linux服务器中内存占用情况的方法

  我们要用的监控内存的脚本在Nagios 市场上,在创建者的Github仓库中也可以找到. 假设我们已经安装了NRPE,我们首先在我们想要监控的服务器上下载脚本. 准备远程服务器 在 Debain/Ubuntu 中: 代码如下: # cd /usr/lib/nagios/plugins/ # wget https://raw.githubusercontent.com/justintime/nagios-plugins/master/check_mem/check_mem.pl # mv ch

降低.NET应用程序内存占用的实践和总结

最近一周比较忙,主要的工作内容是在做一个叫"键盘精灵"的东西,简单来讲就是将很多数据放到内存中,对这些数据进行快速检索,然后找出根据输入条件最匹配的10条记录并予以展示.具体和下面两款炒股软件的相关功能类似: 数据以文本形式存在文件中,且数据量较大,有近20万条,每一条记录有几个字段,以分隔符分割.当时使用的是6万条记录的测试数据,文本文件将近10M,这个模块加载到内存并建立缓存之后,大概会占用将近70-80M的内存.自我接手以后,主要的任务就是降低内存消耗和提高匹配效率. 一.避免创

减少.NET应用程序内存占用的一则实践

最近一周比较忙,主要的工作内容是在做一个叫"键盘精灵"的东西,简单来讲就是将很多数据放到内存中,对这些数据进行快速检索,然后找出根据输入条件最匹配的10条记录并予以展示.具体和下面两款炒股软件的相关功能类似: 数据以文本形式存在文件中,且数据量较大,有近20万条,每一条记录有几个字段,以分隔符分割.当时使用的是6万条记录的测试数据,文本文件将近 10M,这个模块加载到内存并建立缓存之后,大概会占用将近70-80M的内存.自我接手以后,主要的任务就是降低内存消耗和提高匹配效率. 一.避免

JAVA进程占用高内存原因分析与优化方法

  首先看一下一个java进程的jmap输出:  代码如下   [lex@chou ~]$ jmap -heap 837 Attaching to process ID 837, please wait... Debugger attached successfully. Server compiler detected. JVM version is 20.10-b01 using thread-local object allocation. Parallel GC with 2 threa

IIS6 w3wp.exe进程占用cpu和内存过多的解决方法

  今天有朋友问我他的服务器网站访问很卡,内存及CPU占用不能及时释放,从而导致服务器响应速度很慢,这里简单介绍下,方便需要的朋友 在IIS6下,经常出现w3wp.exe的内存及CPU占用不能及时释放,从而导致服务器响应速度很慢. 解决CPU占用过多: 1.在IIS中对每个网站进行单独的应用程序池配置.即互相之间不影响. 2.设置应用程序池的CPU监视,不超过25%(服务器为4CPU),每分钟刷新,超过限制时关闭. 根据w3wp取得是哪一个应用程序池: 1.在任务管理器中增加显示pid字段(任务

原理、方法双管齐下,大神带你细解Redis内存管理和优化

以下内容根据直播视频和幻灯片整理而成. 数据结构 通过了解数据结构,就能知道对象性能,边界条件,就自然而然知道如何恰当的使用它们,做业务时就能选到最合适的对象. 上图是Redis最基本的结构体,所有Redis对象都被封装在RedisObject中.最基本的结构代码往往是最精简的.该结构中有5个成员,type 4 比特,encoding也是4比特.从代码得知: Redis的数据类型不超过16种,编码方式不超过16种,且类型跟编码方式不一一对应,一种类型可能有多个编码方式,数据也可以共享. 首先看O