- 浏览: 162053 次
- 性别:
- 来自: 西安
文章分类
最新评论
一.代码优化
内存会溢出肯定和代码逃不了关系,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、节省内存空间。用脚去想也想得出来代码少了内存里的代码段自然就短了。
发表评论
-
回调hanshu
2018-10-15 23:09 0java callback -
根据类名查找jar包路径
2018-08-12 01:04 940ProtectionDomain pd = StringUt ... -
https
2018-04-20 23:14 01:导出证书用IE的证书工具可以将网站的证书导出。打开网 ... -
mock request
2017-08-20 02:56 0一:postprotected ApplicationCont ... -
使用mockMvc测试文件上传
2017-08-20 01:52 6390@Autowired BanksController bank ... -
java 线程池实现多并发队列后进先出
2017-02-15 00:33 1872java实现线程池多并发队列后进先出 目前默认的队列都是先 ... -
apache ftp server
2017-01-11 22:41 637apache ftp server -
证书制作工具
2016-06-29 23:28 712证书制作工具 -
spring mvc 初始化加载bean
2016-06-15 20:28 1379<context:component-scan bas ... -
Ribbon 和 Eureka 的集成
2016-06-11 00:42 2883Ribbon 是 Netflix 发布的云中间层服务开源项目 ... -
RestTemplate实践
2016-06-11 00:30 948什么是RestTemplate? RestTemplat ... -
@Component(“”)和@resource(name=””)的使用:
2016-06-08 01:24 12262@Component(“”)和@resource(nam ... -
springboot ant部署
2016-06-08 01:03 988springboot ant部署 -
springboot 使用外部tomcat启动
2016-06-05 22:59 1557package sample.xml; import o ... -
swagger 实现文件上传
2016-06-01 22:23 5689@ResponseBody @RequestMa ... -
swagger
2016-06-01 21:18 0import static springfox.docum ... -
java
2016-05-26 01:14 0swagger2.0 -
swagger
2016-05-26 00:32 0spring swagger -
java 域名解析
2016-05-18 23:18 485import java.net.InetAddress;im ... -
swing 模拟文件上传
2016-05-15 17:32 534swing 模拟文件上传
相关推荐
11. **JVM(Java虚拟机)**:理解JVM的工作原理,包括类加载、内存管理(堆、栈、方法区等)、垃圾回收等,有助于优化程序性能。 12. **设计模式**:设计模式是解决软件设计中常见问题的模板,如单例模式、工厂模式...
"JavaSource:Java源码解读"项目旨在帮助开发者深入探索Java的内部工作原理,从而更好地运用和优化代码。在这个项目中,我们可以看到一系列针对Java源码的分析与讨论,主要聚焦于JavaSource-master这一核心部分。 ...
《Java Performance》是一本专注于Java程序性能优化的专业书籍,它为开发者提供了深入理解并提升Java应用程序性能的关键知识。这本书详细探讨了如何在Java开发中识别和解决性能问题,旨在帮助开发者构建更快、更高效...
- **内存优化**:通过调整JVM参数,如堆大小、新生代和老年代比例、GC策略等,以提高应用性能。 - **内存屏障与可见性**:内存模型保证了多线程环境下的数据一致性,例如volatile关键字能提供内存屏障,确保对其他...
本书的作者周志明站在前人的基础上,对JVM进行了全面而深入的解读,不仅覆盖了JVM的基础概念,而且深入探讨了JVM的高级特性,让读者能够更加精细地掌握Java程序的运行机制。内存管理是JVM工作的一个核心部分,尤其是...
C语言的编程规范涵盖基础语法、类型系统、内存管理、预处理器和函数等方面。关键点包括正确使用指针、避免内存越界、理解作用域和链接性,以及充分理解宏定义的副作用。 5. **微软C编程精粹**: 微软的C编程规范...
深入理解Java API的源码对于提升编程技能、优化代码性能以及解决复杂问题至关重要。本篇文章将对Java API的部分关键组件进行源码解读,帮助读者深入理解其工作原理。 1. **对象创建与内存管理**: - `Object`类:...
Java源码解读是Java开发人员深入理解平台工作原理和编程模型的重要途径。在这个"java-src:java源码解读"项目中,我们可以探索Java的核心库,包括JVM(Java虚拟机)、集合框架、并发机制、I/O流、网络编程等多个关键...
Java的内存管理主要依赖于垃圾回收机制,它自动处理对象的创建和销毁,但在某些情况下,不适当的内存配置和编程实践可能导致性能瓶颈或内存泄漏,进而影响系统的稳定性和效率。 首先,理解垃圾回收的基本原理至关...
《JAVA虚拟机解读入门》是一本面向初学者的指南,旨在带领读者深入理解Java虚拟机(JVM)的工作原理和内部机制。...通过学习,你将能够揭开Java虚拟机的神秘面纱,为你的Java编程之路打下坚实的基础。
《Java并发编程实践》是一本深入探讨Java平台上的并发编程的经典著作。这本书旨在帮助开发者理解和掌握如何有效地编写多线程程序,以充分利用现代处理器的多核能力,提高应用程序的性能和响应性。以下是对该书内容的...
下面将根据提供的文件信息,详细解读《Java开发手册》和阿里云Java编程规范测试题答案中的关键知识点。 首先,《Java开发手册》v1.5.0 华山版是一份全面详尽的Java编程指南,包含了命名规则、基本语法、异常处理、...
Java性能优化是软件开发中的一个关键领域,尤其是在大型企业级应用和高并发系统中。《Java性能优化》一书深入探讨了如何通过各种技术提升Java应用程序的效率和响应速度。以下是一些基于书籍源码和相关文件名的关键...
10. **Java内存模型**:Java内存模型(JMM)定义了线程间如何共享和通信,书中解释了其工作原理,包括volatile关键字的作用以及happens-before关系。 以上只是《Java并发编程实践》一书中的部分关键知识点,实际...
第九章:Java内存模型与并发性能优化 最后,书中详细阐述了Java内存模型(JMM)及其对并发的影响,讨论了volatile和synchronized的内存语义。此外,还给出了优化并发程序性能的策略和建议。 总之,《Java并发编程...
10. **JVM与内存管理**:理解Java虚拟机(JVM)的工作原理,包括类加载机制、垃圾收集、内存区域划分等,可以帮助优化代码性能并避免内存泄漏问题。 11. **Java应用开发**:可能包含使用Java进行Web应用开发(如...
2016年的华为Java机试题主要涵盖了Java基础知识、面向对象编程、多线程、集合框架、异常处理、IO流、网络编程、反射以及JVM内存管理等多个核心领域。以下是对这些知识点的详细解读: 1. **Java基础**:这部分试题...
然而,既然任务是基于这些信息生成相关知识点,我们可以在假设这部分内容为误植的情况下,尝试从Java编程的角度出发,创造性的解读并构建出与Java编程相关的知识点。 ### Java代码基础资料概览 #### 1. Java语言...
深度解读在资料后半部分)提供了一个完整的Java项目示例,涵盖了Java语言的多个方面,包括面向对象编程思想、集合框架、输入/输出操作、异常处理、多线程编程、设计模式、数据存储、用户界面设计和代码优化等。...
Java提供了丰富的并发工具和API,如线程、锁、同步块、原子变量、并发容器等,而《Java并发编程实践》这本书正是对这些工具和最佳实践的详细解读。 1. **线程与进程**:在计算机系统中,线程是程序执行的基本单位,...