优化J2ME应用程序

J2ME代码优化的两种方案 前端 综上所述,通过减少对象的创建和销毁次数以及使用缓存和重用对象,可以有效地优化J2ME应用程序的代码。开发人员应根据具体的应用场景和需求,选择适合的优化策略,并在开发过程中进行测试和调优,以实现最佳的性能优化效果。方法中,我们首先检查缓存中是否存在所需的图像对象,如果存在,则直接使用缓存中的对象,避免了对象的重复创建。在J2ME中,频繁的对象创建和销毁会导致内存分配和垃圾回收的开销,从而影响应用程序的性能。通过缓存已经创建的对象,并在需要时重复使用它们,可以避免不必要的对象创建和销毁操作。 阅读详情
优化J2ME应用程序

如果要说J2ME应用程序和J2SE应用程序有什么不同的地方的话,那就是他们各自被限制运行的环境。
很多J2ME系统的主要的瓶颈是存储和运行应用程序的可用内存数量。举例来说,当前许多MIDP设备,他们
限制给应用程序的内存数量就只有50K或更少,离可能要求兆级的基于服务端J2SE环境有段很长的距离。
由于你在开发中会很容易就遭遇这些限制,所以在这篇J2ME技术提示中,你会学到如何让你的应用程序占用最
少的内存。你将用这些技术减少MIDlet占用的空间,MIDlet只是显示一个文本框并且在其中内容被更改
的时候发出声音:
package com.j2medeveloper.techtips;

import javax.microedition.lcdui.*;


public class BeforeSizeOptimization extends
                                         BasicMIDlet {


    public static final Command exitCommand =
                         new Command( "Exit",
                                    Command.EXIT, 1 );


    public BeforeSizeOptimization(){
    }


    protected void initMIDlet(){
        getDisplay().setCurrent( new MainForm() );
    }


    public class MainForm extends Form {
        public MainForm(){
            super( "MainForm" );


            addCommand( exitCommand );
            append( textf );


            setCommandListener( new CommandListener(){
                public void commandAction( Command c,
                                       Displayable d ){
                    if( c == exitCommand ){
                        exitMIDlet();
                    }
                }
              }
            );


            setItemStateListener(
                              new ItemStateListener() {
                public void itemStateChanged(
                                           Item item ){
                    if( item == textf ){
                        AlertType.INFO.playSound(
                                        getDisplay() );
                    }
                }
              }
            );
        }


        private TextField textf =
                  new TextField( "Type anything", null,
                                 20, 0 );


    }
}


尽管这个例子只演示了MIDlet,但是其中用到的技术可以用来优化任何J2ME程序。
注意上面演示的MIDlet要靠下面这个类:
package com.j2medeveloper.techtips;


import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;


public abstract class BasicMIDlet extends MIDlet {


    private Display display;


    public BasicMIDlet(){
    }


    protected void destroyApp( boolean unconditional )
                    throws MIDletStateChangeException {
        exitMIDlet();
    }


    public void exitMIDlet(){
        notifyDestroyed();
    }


    public Display getDisplay(){ return display; }


    protected abstract void initMIDlet();


    protected void pauseApp(){
    }


    protected void startApp()
                    throws MIDletStateChangeException {
        if( display == null ){
            display = Display.getDisplay( this );
            initMIDlet();
        }
    }


}
你用J2ME Wireless Toolkit打包以后,这个MIDlet例子仅仅4K多一点。


减少size的第一步是通过减少应用程序功能来移除一些不必要的类。你的应用程序的每个特性都是真的必要的吗?
你的用户能否忍受没有铃声和哨声?让我们来建立最小版本的应用程序。注意到MIDlet例子已经是相当小的了。


第二步着眼于应用程序定义的内部类,特别是匿名类。记住每一个类文件都有一定相应的空间开支。甚至最微不足道的
类也需要成本:
  public class foo {
        // nothing here
  }
编译这个类,你可以发现你得到一个占用几乎200字节空间的class文件。一个匿名类一般用途是用来实现事件监听。
MIDlet例子定义了两个listener。一个简单优化就是让MIDlet的主类实现CommandListener和ItemStateListener
两个接口,删除里面的listener代码。记住多个对象可以使用相同的listener。如果需要区别开来,
可以传递参数给commanAction和itemStateChanged方法。


内部类也会通过其他方面膨胀代码,因为编译器必须产生不同的变量和方法来允许一个内部类访问封装类里面的私有信息。


第三步是最大程度使用内置的类。举个例子,在基于CLDC的程序中不要建立你自己的集合类。尽量使用内置的Hashtable
和Vector。设计MIDP应用也是一样。MIDlet例子定义了一个Form子类来创建它的主form,但它还能被很容易地直接创建:
  mainForm = new Form( "MainForm" );
  mainForm.addCommand( okCommand );
  mainForm.setCommandListener( listener );
这里没有对和错的问题,这只是需要考虑的一些简单的东西。


第四步是取消你应用程序的继承关系。你可能已经将代码分解成一个或多个抽象类,这是个被推荐的能提高代码重用
的OOD设计方法。也许会跟你学到的东西有抵触,但去简化继承层次更加说的过去。如果你的抽象类——可能来自其他项目——
只是被继承了一次,那简化继承关系就显得特别有理由。MIDlet例子扩展了BaicMIDlet类,但两个类很容易组合成一个。


第五步是缩短你的包名,类名,方法名和数据成员名。看上去这一步显得很愚蠢,但一个class文件保存了很多字符信息。
缩短他们的名字你会减少clas文件的size。这个办法节省的东西不会很多,但当遍及到多个类时他们会增加。包名特别
应该被缩短。因为MIDP应用程序完全是独立的,你能完全避免包名——不会有机会跟该设备其他类的名字冲突。MIDlet例子
可以从com.j2medeveloper.techtips 包里面移出来。


注意缩短名字不是你手工要做的那些东西,我们可以使用一个名叫“扰乱器”的工具来做。扰乱器的主要目的是
为应用程序“隐藏”代码,它反编译程序的时候使程序变成一些几乎无法阅读的东西。这个过程的另外一个作用就是减少了程序的size。
那上因为隐藏代码主要通过重新为方法和数据成员命名。这里有个开发源代码的扰乱器叫RetroGuard的免费工具来自
http://www.retrologic.com,并且上面还有许多商业用的包。


最后,关注一些数组的初始化。(MIDlet例子没有做任何数组初始化,但这是程序很重要的一步)当编译完以后,一个数组初始化
代码像这样:
int arr[] = { 0, 1, 2, 3 };
实际产生的代码如下:
    arr[0] = 0;
    arr[1] = 1;
    arr[2] = 2;
    arr[3] = 3;
如果想研究的话,可以使用java2sdk一起发布的将字节代码分解成一个class的javap工具(使用-c参数)。你可能会惊讶和不满
你所看到的结果。两种可选的办法是(1)把数据编码到一个String里面,运行时解码到数组,或(2)将数据作为二进制文件保存
到程序包里面并在运行时用class loader的getReourceAsStream方法访问。


这里说的东西只是一些指导,并且在这里提到的不是每一步都适合每一个J2ME应用程序。然而,他们大部分都可以应用这个MIDlet例子。
MIDlet的优化版本如下:
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;


public class ASO extends MIDlet
                 implements CommandListener,
                            ItemStateListener {


    private Display   display;
    private Form      mainForm;
    private TextField mainFormTF =
                  new TextField( "Type anything", null,
                                 20, 0 );


    public static final Command exitCommand =
                         new Command( "Exit",
                                     Command.EXIT, 1 );


    public ASO(){
    }


    public void commandAction( Command c,
                               Displayable d ){
        if( c == exitCommand ){
            exitMIDlet();
        }
    }


    protected void destroyApp( boolean unconditional )
                    throws MIDletStateChangeException {
        exitMIDlet();
    }


    public void exitMIDlet(){
        notifyDestroyed();
    }


    public Display getDisplay(){ return display; }


    protected void initMIDlet(){
        mainForm = new Form( "MainForm" );
        mainForm.addCommand( exitCommand );
        mainForm.setCommandListener( this );
        mainForm.setItemStateListener( this );
        mainForm.append( mainFormTF );


        getDisplay().setCurrent( mainForm );
    }


    public void itemStateChanged( Item item ){
        if( item == mainFormTF ){
            AlertType.INFO.playSound( getDisplay() );
        }
    }


    protected void pauseApp(){
    }


    protected void startApp()
                    throws MIDletStateChangeException {
        if( display == null ){
            display = Display.getDisplay( this );
            initMIDlet();
        }
    }
}

 
J2ME应用程序性能优化的探讨 J2ME应用程序性能优化的探讨 pdf格式。 详细信息 立即下载

相关推荐

J2ME应用程序性能优化

J2ME应用程序性能优化J2ME应用程序性能优化

J2ME程序优化方法二十条

J2me程序由于其特殊的运行环境限制,所以优化就显得比较重要,以下是在学习j2me编程所收集的一些技巧和自己的心得。     本文主要是说明j2me平台上的特殊优化方法,与j2se重复的一些技巧就不再赘述了。 1.显示图象时确定好你的fps,最好先做几次小实验,这样能让你在显示效果和运行速度上有比较好的平衡。2.GamaCanvas.getGraphics()每次都会产生一个全新的对象,但是对

Heath's Blog 1855

自制JS某课脚本

根据实际需求自制网页讯网刷题脚本,绕过人脸,弹窗,答题,实现自动化运行

2301_81243054的博客 3458

J2ME开发优化

J2ME开发优化1、猜测Vector的长度2、使用局部变量3、避免字符串比较4、将变量和方法声明为final和static,以加快访问5、使用惰性实例化6、处理outofmemoryError错误7、使用数组而不是对象8、倒计至零的迭代循环,因为和零比较将会较快9、把引用设置为NULL10、最大限度的减少方法调用的次数11、使用移位运算取代乘以二的运算12、避免类型转换13、只要有可能、尽量使用I

zhouyongyang621的专栏 1128

形式化方法(Formal Methods)和人工智能(Artificial Intelligence)

一、形式化方法(Formal Methods) ​ 形式化方法最初应用在硬件上,验证硬件的正确性,后面逐渐应用到软件编程中,能够在软件中找到软件的错误,验证软件的安全可靠。形式化方法更加接近离散数学,所以其应用难度非常大,同时学习成本也较高。再加上形式化方法的大多数理论还停留在上个世纪,由于程序越来越复杂,导致形式化方法进行验证需要大量人工和时间,以至于现在绝大部分软件开发人员完全没有考虑过这个方法,甚至没有听说过这个名词。 ​ 形式化方法最新的应用成果是在工业上,比如一些极其重要且对安全性要求极高的领域(

qq_37030400的博客 4004

一文搞定离线环境下的RAG引擎部署

在人工智能浪潮下,技术已成为构建智能问答、文档分析和代码助手等应用的核心。然而,在许多企业场景中,出于数据安全和性能的考虑,服务器往往部署在中,并要求极致的推理效率。这给依赖外部资源的应用部署带来了巨大挑战。如何在这种严苛的环境下,完整、可靠地部署一套包含向量数据库、**高性能推理服务(vLLM)**和Python后台的复杂RAG系统呢?本文将为你提供一个,手把手教你如何使用 Docker 技术,将一套基于 Weaviate 和的 Python RAG 应用完整打包,并在离线环境中一键部署。

木鱼时刻的专栏 1241

黑通道:功能安全中基于时间/格式/位置约束的确定性通信范式

黑通道是一种面向功能安全的底层通信范式,其核心在于通过硬件级可验证的三重刚性约束——确定性时间窗口、物理层信号格式定义、以及信号路径的空间位置隔离——来实现对不可信系统的可靠监控。它不依赖软件逻辑或语义解析,而是回归对GPIO电平跳变、CAN帧ID与字节位置、多源信号同步误差等物理行为的精确管控,从而支撑IEC 61508、ISO 26262等标准下的SIL3/ASIL-D等级设计。该范式广泛应用于汽车电子急停链路、工业PLC安全I/O、医疗设备电源管理等单点失效零容忍场景,尤其适合MCU+FPGA异构架构

cuiji1279的博客 232

机器学习特征选择-t检验

在特征选择的过程中通过计算检验统计量值,比较特征之间的统计量的大小,并降序排列,选取统计值较高的特征,从而起到去除差别小的特征(此差别小的特征难以区分不同的额类别)的目的。 以t检验(Student's t test)为例: 假设检验 通过比较两类样本的随机变化,通过计算其p值决定是否拒绝零假设,也即是说:通过计算p值,若p值小于某一阈值则认为两个样本具有显著差异,两个样本是不同的,此时拒绝...

heda3的博客 6700

J2ME开发经验:J2ME应用程序内存优化三招

J2ME开发经验:J2ME应用程序内存优化三招 发布时间:2009.05.01 04:36     来源:赛迪网    作者:fen【赛迪网技术社区整理】 一.代码优化 内存会溢出肯定和代码逃不了关系,99.99%学java的人都知道垃圾回收器是java的一大优点并据此来嘲笑C++。显然这个特性为代码编写者省了不少事,但这个特性却带来了不少隐患。举个例子在游戏当中经常有不同场景的切换,如从游戏逻辑

putaoleyuan的专栏 352

STM32堆栈溢出问题及解决方法

堆栈是用于存储函数调用和局部变量的内存区域,它是一种先进后出的数据结构。如果函数嵌套层级过深或者局部变量占用的内存空间过大,堆栈的大小可能不足以容纳这些信息,从而导致堆栈溢出。在一些特殊情况下,可以使用堆内存替代堆栈,以避免堆栈溢出问题。在STM32的工程中,可以通过修改链接脚本文件(.ld文件)中的堆栈大小参数来增加堆栈空间。通常,堆栈大小设置为RAM的一小部分,但需要根据具体应用的需求进行调整。堆栈溢出是嵌入式系统开发中常见的问题之一,特别是在使用STM32微控制器时。3.3 使用堆内存替代堆栈。

ZwcCsharp的博客 2593

告别手动查文献!用Claude Haiku 4.5一键帮你检索+插入参考文献,科研效率直接翻倍(附实操演示+AI提示词)

以下是我的论文段落内容与参考文献列表。以下是我论文段落内容【粘贴论文段落】,请根据每个段落的主题自动检索近五年内的高相关学术文献(以真实DOI或可查询来源为准),要求:1)为每个段落匹配2–3条最相关的文献;另一种是你没有现成的文献列表,需要AI能够帮你检索,筛选输出合适的参考文献列表,并将其正确插入至段落中。选择完成后,先让它检索文献,我设计了一段AI提示词,让Haiku 4.5模型围绕研究主题,给我在各大数据库搜索近五年的文献,并以表格的形式输出文献的核心信息,确保DOI号能直接跳转到原文。

qq_64378896的博客 407

J2ME应用程序内存优化三招

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

Stone的专栏 2812

嵌入式Modbus协议面试题及参考答案

Modbus 协议采用主从模式进行通信,这种模式定义明确,便于在工业环境中实现设备之间的有序数据交互。在主从模式中,存在一个主站(Master)和多个从站(Slave)。主站通常是工业控制系统中的上位机,如 PLC、工控机等,它负责发起通信请求,控制整个通信过程。从站则是各种现场设备,如传感器、执行器等,它们接收主站的请求,并根据请求进行相应的操作,然后将结果返回给主站。主站的主要功能包括:发起数据读取或写入请求、控制通信的时序和流程、处理从站返回的数据。

大模型大数据攻城狮的专栏 2042

关于J2ME应用程序内存优化

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

孺子牛专栏 779

利用AWVS进行反制

awvs 10.5下载 http://www.32r.com/soft/12986.html

渗透之路,攻防之间皆学问 6653

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

J2ME中应用程序的内存优化

一.代码优化内存会溢出肯定和代码逃不了关系,99.99%学java的人都知道垃圾回收器是java的一大优点并据此来嘲笑C++。显然这个特性为代码编写者省了不少事,但这个特性却带来了不少隐患。举个例子在游戏当中经常有不同场景的切换,如从游戏逻辑退到主菜单逻辑,对游戏逻辑对象的态度很多人会选择忘记等待垃圾回收器来收尸。乍看之下似乎并无不妥垃圾回收器会来善后。实际上垃圾回收器并非实时的,它不像C++

blade2001的专栏 529

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

J2ME综合--J2ME应用程序内存优化三招

 一.代码优化内存会溢出肯定和代码逃不了关系,99.99%学java的人都知道垃圾回收器是java的一大优点并据此来嘲笑C++。显然这个特性为代码编写者省了不少事,但这个特性却带来了不少隐患。举个例子在游戏当中经常有不同场景的切换,如从游戏逻辑退到主菜单逻辑,对游戏逻辑对象的态度很多人会选择忘记等待垃圾回收器来收尸。乍看之下似乎并无不妥垃圾回收器会来善后。实际上垃圾回收器并非实

kinglino520的专栏 736

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

J2ME应用程序内存优化

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

mallven.com 150

j2me应用程序内存优化三招

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

509
上一篇: 第十章:CDC API
下一篇: Rainbow Portal 架构
SmartJavaer
博客等级 码龄21年 13粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值