`

【转】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基础优化编程知识点详解 #### 一、Java内存管理:堆内存与栈内存 Java虚拟机(JVM)管理着两种类型的内存:堆内存(heap)和栈内存(stack)。堆内存主要用于存储程序运行时创建的对象和实例变量,它是...

    Java界面版 内存地址转换的三种方式过程演示

    Java中的NIO(New IO)库允许程序在堆外分配内存,绕过Java内存管理,直接操作内存地址。通过`ByteBuffer`类,我们可以分配并访问直接内存,这通常用于高性能的数据交换,如网络I/O。 2. **JNI(Java Native ...

    Java动画编程优化技术探讨.pdf

    在Java动画编程问题研究部分,文档提到了四个主要问题点:动画死机或图像迟滞问题、动画无法调控或卡顿问题、动画显示不平滑或闪烁问题、以及内存泄露问题。 首先,动画死机或图像迟滞问题通常是由于在动画编程中...

    Java内存泄露及内存无法回收解决方案

    Java内存管理是编程中至关重要的一个环节,尤其是对于大型、长时间运行的应用来说,内存泄漏和内存无法回收可能导致系统性能下降,甚至导致系统崩溃。本文将深入探讨Java内存泄露的原理,分析内存无法回收的原因,并...

    深入理解Java内存模型 pdf 超清版

    Java内存模型,简称JMM(Java Memory Model),是Java编程语言规范的一部分,它定义了程序中各个线程如何访问和修改共享变量,以及如何确保数据的一致性。深入理解Java内存模型对于编写高效的并发程序至关重要。本文...

    Java内存监视器.rar

    Java内存模型主要分为三个区域:堆内存(Heap)、栈内存(Stack)和方法区(Method Area),在Java 8及以后版本,还包含了元空间(Metaspace)。每个区域都有其特定的用途: 1. **堆内存**:存储所有对象实例和数组...

    游戏编程游戏编程java游戏编程java

    Java 游戏编程是计算机科学领域的一个重要分支,它结合了Java编程语言的强大功能与游戏开发的创新思维。Java作为一种跨平台的编程语言,被广泛应用于各种类型的游戏开发,从小型的手机游戏到大型的PC游戏,都有其...

    Java服务器高级编程

    本文将围绕Java服务器编程的关键知识点展开,包括但不限于Servlet、JSP、EJB、Spring框架、微服务架构、多线程、网络通信、数据库连接池以及性能优化等方面。 1. **Servlet与JSP**:Servlet是Java标准版(Java SE)...

    Java完美编程(第三版)

    10. **Chapter18.pdf**:可能是对Java高级特性和最佳实践的总结,例如垃圾回收机制、性能优化技巧、内存管理、JVM调优以及现代Java开发中的设计模式。 通过学习《Java完美编程(第三版)》的这些章节,读者将能够构建...

    C和java混合编程

    编写完成后,需要使用Java的`javah`工具生成对应的C头文件,这个头文件包含了Java类的本地方法声明。接着,使用C/C++编译器(如GCC或Clang)编译源代码,并链接到Java运行时库,以创建动态链接库(DLL或.so文件,取...

    cpu 内存模型和java内存模型

    Java程序员了解CPU以及相关的内存模型,对于深入理解Java内存模型以及并发编程至关重要。CPU作为计算机硬件的核心,其架构和工作原理影响着软件的性能和执行效率。尤其在Java这种多线程、高并发的编程语言中,对CPU...

    深入理解 Java 内存模型_程晓明_InfoQ_java_内存模型_

    Java内存模型,简称JMM(Java Memory Model),是Java编程语言规范的一部分,它定义了线程如何共享和访问内存,以及在多线程环境中如何保证数据一致性。理解JMM对于编写高效、正确且线程安全的Java代码至关重要。 ...

    Java性能优化技巧集锦

    总结,Java性能优化是一个全方位的过程,需要从代码编写、框架选择、资源配置等多个层面考虑。通过深入理解这些知识点并应用于实践中,可以显著提升Java应用程序的运行效率。在实际工作中,应结合具体项目需求和资源...

    深入理解 Java 内存模型

    Java 内存模型(Java Memory Model,简称 JMM)是 Java 平台中关于线程如何访问共享变量的一套规则,它定义了线程之间的内存可见性、数据一致性以及指令重排序等关键概念,对于多线程编程和并发性能优化至关重要。...

    Java完美编程(第三版).

    在内存管理和性能优化方面,书中会探讨垃圾回收机制,这是Java自动内存管理的关键,以及如何避免内存泄漏。此外,还会讲解线程编程,包括线程的创建、同步、互斥和死锁问题,这对于构建多线程应用至关重要。 对于...

    JAVA并发编程实践

    - **happens-before原则**:用于定义两个操作之间的部分顺序,是理解Java内存模型的关键。 ### 二、Java并发编程进阶 #### 2.1 锁机制 - **synchronized关键字**:提供了内置的锁机制,可以用于方法或代码块。 - *...

    java内存分配 内存泄漏

    Java 内存分配主要发生在JVM的三个主要区域:堆(Heap)、栈(Stack)和方法区(Method Area)。堆是Java对象的主要存储区域,所有的实例对象和数组都在堆中分配内存。栈则存储方法调用时的局部变量和方法的返回地址...

    java虚拟机并发编程

    - **内存模型**:Java内存模型定义了线程之间的内存可见性和有序性规则,确保了数据的一致性和线程之间的正确交互。 - **垃圾回收器**:现代JVM支持并发垃圾收集器,能够在应用程序运行时清理不再使用的对象,减少对...

    CPlus_to_Java_Converter;C++转java工具

    《C++到Java转换器:理解跨语言编程的挑战与实践》 在计算机科学领域,跨语言编程是一项关键技能,特别是在需要利用不同编程语言的优势时。C++和Java是两种广泛应用且具有各自特点的编程语言。C++以其高效、灵活和...

Global site tag (gtag.js) - Google Analytics