垃圾回收的一些知识总结:
1、被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉。
2、父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会导致了父对象不会被删除。
3、如果一个对象中引用了外部对象,当自己被删除或者不需要使用此引用对象时,一定要记得把此对象的引用设置为null。
4、本对象删除不了的原因不一定是自己被引用了,也有可能是自己的孩子被外部引用了,孩子删不掉导致父亲也删不掉。
5、除了引用需要删除外,系统组件或者全局工具、管理类如果提供了卸载方法的就一定要调用删除内部对象,否则有可能会造成内存泄露和性能损失。
6、父对象立刻被删除了不代表子对象就会被删除或立刻被删除,可能会在后期被系统自动删除或第二次移除操作时被删除。
7、如果父对象remove了子对象后没有清除对子对象的引用,子对象一样是不能被删除的,父对象也不能被删除。
8、注册的事件如果没有被移除不影响自定义的强行回收机制,但有可能会影响正常的回收机制,所以最好是做到注册的事件监听器都要记得移除干净。
9、父对象被删除了不代表其余子对象都删除了,找到一种状态的泄露代码不等于其他状态就没有泄露了,要各模块各状态逐个进行测试分析,直到测试任何状态下都能删除整个对象为止。
10、当触发了某个event后,不再使用的话,请将其remove掉。
11、能不使用Effect就不要使用Effect。
内存泄露举例:
1、引用泄露:对子对象的引用,外部对本对象或子对象的引用都需要置null。
2、
系统类泄露:使用了系统类而忘记做删除操作了,如BindingUtils.bindSetter(),ChangeWatcher.watch()函数
时候完毕后需要调用ChangeWatcher.unwatch()函数来清除引用 ,否则使用此函数的对象将不会被删除;
类似的还有MUSIC,VIDEO,IMAGE,TIMER,EVENT,BINDING等。
3、效果泄露:当对组件应用效果Effect的时候,当本对象本删除时需要把本对象和子对象上的Effect动画停止掉,然后把Effect的target对象置null; 如果不停止掉动画直接把 Effect置null将不能正常移除对象。
4、SWF泄露:要完全删除一个SWF要调用它的unload()方法并且把对象置null。
5、图片泄露:当Image对象使用完毕后要把source置null。
6、声音、视频泄露: 当不需要一个音乐或视频是需要停止音乐,删除对象,引用置null。
内存泄露解决方法:
1.
在组件的REMOVED_FROM_STAGE事件回掉中做垃圾处理操作(移除所有对外引用(不管是VO还是组件的都需要删除),删除监听器,调用系统类
的清除方法) 先remove再置null, 确保被remove或者removeAll后的对象在外部的引用全部释放干净。
2. 利用Flex的性能优化工具Profile来对项目进程进行监控,可知道历史创建过哪些对象,目前有哪些对象没有被删除,创建的数量,占用的内存比例和用量,创建过程等信息。
总结:关键还是要做好清除工作,自己设置的引用自己要记得删除,自己用过的系统类要记得做好回收处理工作。 以上问题解决的好的话不需要自定义强制回收器也有可能被系统正常的自动回收掉。
众所周知,由于Flash Player的垃圾回收机制是自动进行的,因此就算是上述内容的内容都符合要求,那么还是会产生内存“高居不下”的情况。
因此,我接下来介绍一个非常规的方式,让Flash Player的垃圾回收机制在我的控制之中。(以下的内容也不是我首创的,但是特此总结说明一下)
强制垃圾回收:(即著名的hack方式)
通过故意让SWF在运行时出错,然后throw出错误,而同时通过catch error来继续运行SWF文件。而垃圾回收机则会在SWF抛出错误的时候,被强制执行一次,以清除内存中无效的数据占用,减少资源的消耗。
下面是我找到一个通过这种hack方式处理垃圾回收的代码:
package util
{
import flash.net.LocalConnection;
import flash.system.System;
public class Memory {
public function Memory() {
//TO DO
}
public static function gc() : void {
try {
new LocalConnection().connect( 'foo' );
new LocalConnection().connect( 'foo' );
} catch ( e : * ) {}
}
public static function get used() : Number {
return System.totalMemory;
}
}
}
关于上面代码如何使用,目前大致上有两种使用方法:
1、在项目开始的时候,建立一个timer,然后每个一分钟就执行一次Memory.gc();
2、找一台配置一般的机器,然后运行你要的程序。然后在CPU、Memory占用很高的地方,记录一下当时的内存值,之后再自认为需要的地方(例如位图运算、Effect效果完成后等地方),执行Memory.gc();
分享到:
相关推荐
在Flex项目中,开发者可能会使用Flex的组件库来创建类似的应用界面,并通过ActionScript处理数据和业务逻辑。 通过这个"Flex实战项目",开发者不仅可以深入了解Flex框架,还能锻炼实际项目开发的能力,包括UI设计、...
Flex编译优化方法是提升开发效率的关键,尤其是在大型Flex项目中,编译时间长和Eclipse性能问题可能严重影响开发流程。...同时,保持Eclipse和Flex SDK的更新也很重要,因为新版本通常会包含性能优化和bug修复。
8. **优化与性能**:探索如何优化Flex应用的性能,减少内存占用,提高响应速度,这对于大型和复杂的Flex项目尤其重要。 通过对这些知识点的深入学习和实践,你不仅可以掌握Flex项目开发的基本技能,还能提升对RIA...
Java整合Flex项目是一种技术组合,将Java后端与Adobe Flex前端进行集成,以构建富互联网应用程序(Rich Internet Applications,RIAs)。在这样的架构中,Java通常作为服务器端处理业务逻辑和数据管理,而Flex则负责...
在构建一个基于Flex和Java的Web项目时,我们需要掌握几个关键知识点。Flex是一种用于创建富互联网应用程序(RIA)的...在实际项目中,还需要关注代码规范、错误处理、性能优化等多个方面,确保项目的高质量和可维护性。
SSH+Flex项目是一种基于Flex前端和SSH2(Spring、Struts2、Hibernate)后端框架的开发模式,结合MySql...在实际开发过程中,还需要考虑到性能优化、安全性、可维护性和扩展性等因素,以确保系统的稳定运行和长期发展。
- **.flexProperties**:包含Flex项目的特定属性,如编译设置和源文件位置。 - **.project**:Eclipse或Flash Builder项目配置文件,定义项目结构和构建路径。 - **html-template**:用于生成SWF嵌入HTML的模板。...
5. **安全与性能优化**: 为确保通信安全,应使用HTTPS进行加密传输,并对敏感信息进行加密处理。同时,通过缓存策略、负载均衡和数据库优化来提高系统性能。 6. **错误处理和调试**: 双方都需要有良好的错误...
【Flex瘦身优化】是针对Flex开发中遇到的项目体积过大的问题进行的...通过以上方法,可以有效优化Flex项目的大小,提高加载速度,提升用户体验。在实际开发中,还需要根据项目的具体需求和特点,灵活运用这些优化策略。
"test_avatar.rar_flex_游戏优化"这个标题暗示了我们正在探讨一个与Flex相关的游戏项目,其中包含了对游戏性能的改进措施,特别是针对矢量图形的优化,以提高游戏的速度。 Flex是一种基于ActionScript 3.0的开源...
7. **调试与优化**:通过分析源码,你可以学习如何调试Flex应用,以及如何优化性能和内存使用。 总之,这个Flex项目示例源码是学习和实践Flex开发的宝贵资源。通过深入研究并理解其中的代码,你可以提升自己的Flex...
2. **项目创建**:使用Flex Builder或Flash Builder创建一个新的Flex项目,并设置其与Java项目的交互方式,如配置Flex模块(Flex Modules)和Java应用程序的连接。 3. **通信机制**:解释如何使用AMF(Action ...
这可能包括错误处理、性能优化、用户体验设计等方面的考虑。例如,对于大文件上传,可能需要实现进度条显示,以便用户了解传输状态;对于下载,可能需要处理断点续传,确保用户在下载过程中不会丢失已下载的数据。 ...
8. **性能优化**: 在实际项目中,为了提高性能,可能需要优化数据传输、缓存策略、服务器负载均衡等方面。例如,使用GZIP压缩HTTP响应,利用AMF的低带宽需求,以及合理地设计服务接口以减少不必要的网络请求。 综...
2. **Flex项目集成WEB功能**:Flex作为前端,与后端Web服务进行集成,提供丰富的用户界面。 3. **WEB项目集成Flex功能**:Web项目中嵌入Flex组件,这是本文所介绍的方法,即在现有的Web应用基础上添加Flex功能。 ...
在Flex项目开发中,有时我们需要将外部网页内容嵌入到我们的应用中,这时Google IFrame就成为了一个常用的选择。...在Flex项目中,我们同样可以利用IFrame...记得在实际应用中不断测试和优化,确保IFrame的稳定性和性能。
在本教程中,"作者说明.txt"可能包含了作者的学习心得和使用建议,"Flex中的架包"可能是Flex项目的源码或库文件,供读者参考和学习。通过阅读这些材料,你将能够逐步掌握Flex开发技术,踏上Flex开发之旅。
- **性能优化**:提供了一系列技巧和策略,帮助开发者优化Flex应用的加载速度和运行效率。 - **跨平台开发**:探讨了如何利用Flex开发跨桌面和移动平台的应用程序。 - **调试和测试**:教授有效的调试技术和单元测试...
9. **性能优化**:由于3D渲染对计算资源的需求较高,因此理解内存管理、对象池和批处理技术对于优化Away3D应用至关重要。 10. **3DParking实例**:根据提供的文件名,3DParking可能是示例项目,演示如何在Flex中...
【Java整合Flex的Web小项目】是一个典型的前后端分离的应用开发案例,主要涉及的技术栈包括Java、...在实际开发中,还需要考虑错误处理、安全措施(如SQL注入防护)、性能优化等方面,以提升应用的整体质量和用户体验。