解读JAVA内存优化编程的三个方法
内存会溢出肯定和代码逃不了关系,99.99%学java的人都知道垃圾回收器是 java的一大优点并据此来嘲笑C++。显然这个特性为代码编写者省了不少事,但这个特性却带来了不少隐患。
一.代码优化
内存会溢出肯定和代码逃不了关系,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、节省内存空间。用脚去想也想得出来代码少了内存里的代码段自然就短了。
相关推荐
《KJava深入浅出——Java在PDA上的程序设计》一书主要涵盖了Java技术在掌上设备(PDA)上的应用开发,旨在帮助开发者理解和掌握KJava编程的基础知识和实战技巧。KJava是Java Micro Edition (Java ME)的一个分支,...
Java 3D编程是Java平台上的一个强大工具,用于创建和展示复杂的三维图形和动画。在互联网上,Java 3D技术提供了一种交互式的、跨平台的方式,使得用户可以在网页浏览器中体验丰富的三维视觉效果。这本书《Java 3D...
《Java 3D编程实践——网络上的三维动画》是一本深入探讨如何利用Java 3D技术创建网络上交互式三维动画的书籍。源代码提供了书中示例程序的详细实现,帮助读者更好地理解和学习Java 3D编程的核心概念和技术。本文将...
该系统模拟了电影院三个售票窗口同时出售电影票的过程,通过 Java 多线程编程实现了多窗口同时出票、随机出票间隔和避免重复出售相同电影票的功能。 一、 Java 多线程编程概念 Java 多线程编程是指在同一个程序中...
6、有两只兔子,每三个月生育两只兔子,生下来的兔子每过3个月又可以生兔子,求n个月后,一共有多少只兔子? 第二次编程题目: 1.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 2.一个数如果...
Java 3D编程实践是Java平台上的一个强大工具,它为开发者提供了构建三维图形和动画的能力,使得在互联网上创建互动、生动的三维应用成为可能。对于初学者来说,掌握Java 3D技术不仅可以增强你的编程技能,还能开启在...
Java Web开发是构建互联网应用程序的重要领域,它涵盖了服务器端编程、网页交互以及数据库管理等多个方面。本主题将深入探讨Java Web开发的核心基础知识,帮助你全面理解这一技术的内在机制。 一、Java Web 开发...
《JAVA入门到精通——30天学通JAVA》是一本专为初学者设计的Java编程教程,旨在帮助读者在短短的30天内快速掌握Java编程基础,从而踏入编程世界的大门。Java作为一种广泛应用于互联网、移动应用、企业级开发等领域的...
综上所述,"Java3D编程实践——网络上的三维动画"这本书会深入讲解如何使用Java3D API进行3D场景的构建、动画的制作以及网络交互。通过学习这本书,开发者可以掌握创建动态、互动且在网络环境中运行的三维应用程序所...
三、KJava编程基础 1. API学习:KJava提供了特定的API,用于处理设备特性,如键盘输入、屏幕显示、网络连接等。 2. 类库理解:了解KJava提供的核心类库,如UI组件、网络通信、数据存储等。 3. 程序结构:掌握KJava...
【标题】"HNU编程新技术实务实验一——Java语言编程"揭示了这是一份与Java编程相关的学习资源,特别关注于湖南大学(HNU)的编程新技术实务课程中的实验项目。这个实验可能涵盖基础到进阶的Java编程概念,旨在帮助...
在Java编程环境中,尽管程序员通常不需要直接处理内存地址,但在进行系统级编程或者理解底层工作原理时,了解内存地址转换是必要的。本项目以Java实现,通过图形界面展示了三种内存地址转换的方法,这对于我们深入...
### Java自学之路——超详细含练习项目及源码 #### Java知识体系最强总结 本篇文章旨在根据提供的文件信息,深入解读Java自学之路的关键知识点,并针对其中提到的学习资源进行详细的解析,帮助初学者更好地掌握...
Java3D探奇——IBM中国教程是一份专为初学者设计的在线教程,旨在帮助那些没有3D编程经验的程序员快速入门Java 3D技术。Java 3D是Oracle公司开发的一个开源API,它提供了丰富的功能,使得开发者可以构建复杂的三维...
Java之——类热加载 在Java编程中,类的加载是程序运行的重要环节。传统的Java应用程序在启动时,由JVM(Java虚拟机)通过类加载器将类加载到内存中,一旦加载完成,除非程序退出,否则这些类通常不会被重新加载。...
在本教程“Java 3D编程实践——网络上的三维动画”中,读者将深入理解如何利用Java 3D库来构建网络上的交互式3D应用。尽管这个资源可能有些年代感,但它提供的基础知识和编程理念对于初学者仍然极具价值。 首先,...
本文将深入探讨Android系统中的常见内存泄露问题及其优化方案,主要针对Java编程语言。 一、内存泄露的理解与类型 内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄露可能看似无关痛痒,...
Java自学之路——精华版 Java作为一种广泛使用的编程语言,对于初学者来说,有着丰富的资源和广阔的学习路径。本文将提供一份详细的自学指南,帮助你高效地掌握Java编程技能。 一、选择合适的自学资源 在开始Java...
方法是Java编程语言中用于封装特定功能的代码块。它允许程序员将程序划分为逻辑上独立的小单元,这些单元可以被多次重复使用。通过定义方法,可以提高代码的复用性和可维护性。 #### 2. 方法的定义 方法的基本语法...