`
liuwei_blog
  • 浏览: 94393 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

解读JAVA内存优化编程的三个方法

    博客分类:
  • java
阅读更多

 

一.代码优化

内存会溢出肯定和代码逃不了关系,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前后的内存剩余打印出来对比看看。所以防止内存溢出最直接的办法就是从图片入手。

图片压缩: 多数人马上会想到这个办法。不错这个办法是最有效的。在photoshop里图片制作完成后不要选择 "存储为",而是选择 "存储为 web 所用格式" 可以根据里面的选项进行压缩,特别是颜色这一项越小越好不过相应的图像会有所失真。不要认为这样就完了。

实际上该图片还可以再次压缩,在网上有许多类似的工具。推荐一款可以压缩png格式的软件 xat.com Image Optimizer 效果不错。经常都有 70% 的压缩率且图像不会失真。

假如你有多张规格一样的图片,那么建议你把它做成一张长条图片。有两个原因:

1、这样节省存储空间和内存空间。大家可做个试验将10张图片的内容放在一张当中对比看看文件大小有没有变化。

2 、10张图片需要10个image 对象需要进行10次io操作浪费时间不说还浪费内存。当笔者发现这个好处时兴奋地把所有图片都存成一张,吱地一声内存又溢出了...原因想必大家也知道!!图片太大了不要把不同界面的图片整合在一起否则经常会得不偿失。

作图时还有一些细节需要注意,颜色数量,分辩率,图像模式(最好是索引颜色),画布大小都会影响到图片大小。

三.工具优化

谁都知道混淆器是用来保护代码的以加大反编译的难度(个人认为这是在嘲笑程序员的智商)。实际上用它来优化程序也是不错的选择,至少有两点好处:

1、压缩程序大小。一个60k的程序经常可以压掉10k左右。10k的空间对于写低端手机的程序员简直是雪中送碳,多少超过64k限制的游戏都受过它的恩惠;

2、节省内存空间。用脚去想也想得出来代码少了内存里的代码段自然就短了。

分享到:
评论

相关推荐

    java笔记与java核心内容解读

    11. **JVM(Java虚拟机)**:理解JVM的工作原理,包括类加载、内存管理(堆、栈、方法区等)、垃圾回收等,有助于优化程序性能。 12. **设计模式**:设计模式是解决软件设计中常见问题的模板,如单例模式、工厂模式...

    Java 性能优化 一书源码

    Java性能优化是软件开发中的一个关键领域,尤其是在大型企业级应用和高并发系统中。《Java性能优化》一书深入探讨了如何通过各种技术提升Java应用程序的效率和响应速度。以下是一些基于书籍源码和相关文件名的关键...

    Java编程思想重点笔记(Java开发必看)

    ### Java编程思想重点知识点解析 #### 一、Java中的多态性理解 多态性是面向对象编程的一个核心特性,允许子类对象替代父类对象。在Java中,多态性的实现主要通过以下几种方式: 1. **动态绑定**:在Java中,除了...

    Java 图形与动画编程实例 上册

    2. **Java 3D入门**:Java 3D是Oracle公司提供的一个高级三维图形库,允许开发者创建交互式的、复杂的3D场景。这部分将讲解如何设置Java 3D环境,理解基本的3D坐标系统,以及如何创建和操作3D对象。 3. **3D几何与...

    Java完美编程(第三版)

    《Java完美编程(第三版)》是一本专为Java初学者和进阶者设计的教程,旨在帮助读者全面掌握Java编程技术。这本书以其易学习、易上手的特点,深受广大编程爱好者喜爱。以下是对该书内容的详细解读: 1. **Java语言...

    java-com.zip_JAVA UART_java 上位机_java上位机_java上位机编程_上位机界面

    Java UART(通用异步接收发送器)是一种在Java编程中实现串行通信的方法,它允许设备之间通过串行端口进行数据传输。在本案例中,"java-com.zip" 包含了一个简单的Java上位机软件,用于监听并操作COM1串行端口。...

    java实现hanoi编程

    ### Java实现汉诺塔(Hanoi)编程:深入解析与代码解读 #### 汉诺塔问题概述 汉诺塔(Tower of Hanoi),又称河内塔,是一种源自印度古老传说的数学游戏,也是一个经典的递归算法案例。传说在世界中心贝拿勒斯...

    Ch12-jAVA高级编程无参方法.txt

    综上所述,无参方法在Java编程中是一种常见的方法类型,它们可以简化代码逻辑,提高程序的可读性和维护性。了解其基本概念、命名规则以及如何正确使用静态与实例方法对于编写高质量的Java程序至关重要。

    Java程序性能优化之二十三个建议

    在Java编程领域,性能优化是提升应用程序效率的关键环节。这篇博文“Java程序性能优化之二十三个建议”可能涵盖了多种优化策略,旨在帮助开发者改善Java应用的运行速度和资源利用率。以下是对这些优化建议的详细解读...

    Java、Python和Matlab混合编程及其在气象中的应用.pdf

    在探索混合编程及其在特定行业,如气象领域应用的这篇文献中,作者们详细讨论了Java、Python和Matlab这三种编程语言的混合使用方法,并展示了如何利用这些语言的特性对气象数据进行分析、处理、可视化以及发布。...

    详细解读Java的串口编程

    Java的串口编程是通过JavaComm和RxTx这两个库来实现的,这两个库分别有其特定的安装和使用方法。 首先,我们来看JavaComm的安装和使用。JavaComm是Java官方提供的串口通信API,但它并不是Java2标准版的组成部分,...

    (word完整版)Java趣味编程100例.doc

    本资源摘要信息主要介绍了Java趣味编程100例,涵盖了Java编程语言的基础知识和实践应用。下面是对标题、描述、标签和部分内容的解读和知识点总结。 标题:(word完整版)Java趣味编程100例 描述:(word完整版)...

    JAVA面向对象编程(孙卫琴)读书笔记(三)

    在本篇【JAVA面向对象编程(孙卫琴)读书笔记(三)】中,我们将深入探讨Java编程语言的核心概念——面向对象编程。这篇读书笔记基于孙卫琴老师的著作,旨在帮助开发者更好地理解和应用面向对象的设计原则和技巧。下面...

    深入解读Java12&13;新特性.zip

    3. **Heap Inspection Tool (JEP 337)**: 新的命令行工具`jmap`增加了堆内存检查功能,允许开发者在不使用JVM挂起的情况下获取堆信息,这对于诊断内存泄漏和优化内存使用非常有用。 4. **JIT Watcher (JEP 338)**: ...

    java编程星号打印输出程序

    ### Java编程实现星号打印输出程序 在Java编程语言中,使用循环结构来创建特定的图形或模式是一种常见的练习方式,有助于加深对控制结构(如for循环)的理解。本篇文章将详细解析一个简单的Java程序,该程序用于...

    JAVA编程思想课后习题答案.pdf

    * 在main方法中,定义了一个名为ATypeName的类,该类包含三个成员变量:i、d、b,以及一个名为show的方法,该方法用于打印成员变量的值。 * 在main方法中,创建了一个ATypeName对象a,设置了其成员变量的值,并调用...

    java毕设源码范例和详细说明(由浅入深,深度解读在资料后半部分).docx

    该思想强调了封装、继承和多态性三个基本特征。通过使用类和对象来描述学生信息,实现了信息的封装和隐藏。 知识点2:Java集合框架 在学生信息管理系统项目中,使用了Java集合框架中的ArrayList类来存储学生信息。...

    java 设计模式幽默解读

    "大牛解读Java设计模式.pdf"这本书籍,作为这个主题的载体,很可能是由资深专家撰写,用生动的语言和实例帮助读者理解抽象的设计概念,从而提升他们的编程技能。无论你是初学者还是有经验的开发者,都能从中受益匪浅...

    JAVA面试核心知识点整理(283页).pdf

    本文档旨在为Java开发者提供一个 hệ thống的面试知识点整理,涵盖了Java的核心概念、JVM的工作原理、Java编程语言的基本语法和高级特性等多方面的知识点。下面是对该文档的详细解读。 JVM知识点 JVM(Java ...

Global site tag (gtag.js) - Google Analytics