随着Web 2.0技术的深入发展,Flex成为很多企业级应用的前端展示层。虽然Flex应用运行于FlashPalyer虚拟机之上,但是开发人员仍然会遇到一些内存泄露问题,那么如何分析和定位根源呢?IBM工程师王鹏最近撰文详细描述了检测Flex应用内存泄露的方方面面。
Flex采用ActionScript语言作为脚本语言,运行在FlashPlayer虚拟机之上,其垃圾回收机制概括如下:
Flex 应用的对象在内存中被映射成树形结构。这很好理解,每个Flex应用总有一个Application的入口被称为根节点(Root),垃圾收集器从根节点开始遍历每个对象,对可达对象标记为“有效”(有一种例外就是弱引用)。而在这棵树之外的孤岛对象或者由于循环引用形成的孤岛对象集合被标记为“无效”,垃圾收集器会在合适的时间销毁这些无效对象,完成一次垃圾收集。而垃圾收集器是运行在虚拟机中的一个低优先级的守护进程,为了不影响性能,它只在必要的时候才运行。例如在向操作系统申请新内存空间的时候,发生异常的时候等等,因此内存并不是实时回收的。
在Flex应用开发过程中,主要存在两种泄露情况:
-
显式引用:由于表达式赋值或者对象参数传递等原因,已经“无用”的对象被保持引用,导致虚拟机无法正常回收。
-
隐式引用:由于事件监听注册等操作,导致对象之间存在引用,产生泄露风险。
针对以上泄露问题,文章建议大家采用Adobe公司在Flex Builder 3中提供的Profiler工具来分析和定位泄露根源:
-
内存快照法:通过对于相同操作做反复内存快照(Profiler工具支持)比较,找出持续增加的对象实例,就可能发现泄露根源。
-
游荡对象法:当Flex应用特别复杂时,可以利用Profiler 工具中的“Find Loitoring Objects”查找游荡对象,比较不同状态转换之间的对象变化,可能会发现泄露的对象。
当然,凡事应以“预防为主”,所以作者最后总结了几点开发建议:
- 对于显式引用,要尽量减少对临时对象的引用,尤其是全局变量、静态变量、使用单例模式创建的变量对临时变量的引用。这些变量包含stage、systemManager、application、MVC框架中Model和Controller,还有以Manager命名的对象等等。另外,临时变量本身要尽量做到高内聚性,对象内部尽量减少对外部对象尤其是全局对象的依赖。
- 对于隐式引用,使用弱引用方式注册事件监听器,将最后一个参数useWeakReference设置为true:a.addEventListener("Leak", b.leakHandler, false, 0, true); 这样做的结果是垃圾回收器在做标记时,会忽略a对于b的引用,如果b没有被其他对象引用,垃圾回收器就把它标记为“无效”进而回收,从而避免内存泄露。
内存泄露一直是开发社区普遍关注的问题,即使在虚拟机时代,某些泄露问题仍然值得大家讨论和研究。
分享到:
相关推荐
Flex 应用内存泄露的分析与诊断主要集中在 Flex 应用程序中由于内存管理不当导致的问题。Flex 使用 ActionScript 语言编写,其运行环境在 FlashPlayer 的 ActionScript Virtual Machine (AVM) 中,该虚拟机包含一个...
- 使用内存分析工具(如Adobe的Flex Builder或第三方工具)进行定期的内存分析,以发现潜在的内存泄露问题。 通过遵循这些原则,开发者可以有效地减少Flex应用中的内存泄露,从而提高应用的性能和稳定性。
在Flex开发中,内存泄漏是一个严重的问题,它会导致应用程序占用过多的系统资源,影响性能,甚至可能导致程序...通过遵循上述建议,开发者可以有效地管理和减少Flex应用程序中的内存泄漏,从而提高应用的稳定性和性能。
### Flex应用内存泄露的分析与诊断 #### 引言 Flex是一种用于构建和部署富互联网应用(RIA)的技术,它采用ActionScript语言作为脚本语言,并在Flash Player虚拟机(AVM)中运行。如同其他高级编程语言一样,AVM...
在IT行业中,内存泄漏是开发者面临的一个重要问题,特别是在使用像Flex这样的技术时。本篇内容将深入探讨Flex中的内存泄漏...记住,理解和调试内存泄漏问题需要耐心和细心,但它对于优化Flex应用的长期健康至关重要。
Flex虚拟机,全称为...了解和掌握Flex虚拟机的内存管理机制,以及采取有效的防止内存泄漏的措施,是优化Flex应用程序性能和稳定性的重要步骤。通过合理地管理内存,开发者可以创建出更高效、更稳定的Flex应用程序。
在Flex开发中,内存泄露是一个常见的问题,它会导致应用程序占用过多的内存,影响性能甚至导致程序崩溃。本文将深入探讨Flex中可能导致内存泄露的一些常见原因,并提供相应的解决方案。 首先,事件监听是导致内存...
Flex内存泄露总结主要聚焦在Flash Player的垃圾回收机制和内存管理问题上,这对于优化Flex应用程序的性能至关重要。首先,我们要理解垃圾回收的基本原理。在Flash Player中,内存的释放工作由垃圾回收器负责,它是一...
Flex应用通常涉及大量的交互和动态数据处理,因此性能优化和内存管理是开发过程中的关键环节。以下是对Flex性能优化和内存查看的深入探讨: 1. **Flex性能优化**: - **代码优化**:减少不必要的计算,避免在循环...
通过遵循上述内存释放优化原则,开发者可以显著提升FLEX应用程序的性能和稳定性。合理管理内存不仅可以提高用户体验,还能减少开发过程中的调试时间和成本。因此,在开发过程中始终关注内存管理的最佳实践是非常必要...
AIR相关问题:Adobe AIR应用程序在运行时可能会遇到一些特有的内存问题,比如本地共享对象(LSO)和数据库内存泄漏。开发者需要对此类问题有所了解并采取相应措施。 Flash Builder Profiler:这是一个强大的工具,...
然而,即使有了自动垃圾回收机制的支持,Flex应用程序仍可能遇到内存泄漏问题,因此了解Flex的内存管理机制至关重要。 #### 三、Flex的垃圾回收机制 **1. Flash Player的垃圾回收机制** Flash Player中的垃圾回收...
通过以上步骤,开发者可以深入分析Flex应用程序的性能瓶颈,优化代码,减少内存泄漏,提升应用程序的运行效率。使用flex profile进行性能分析是提升Flex应用性能的关键步骤之一,它提供了宝贵的数据和洞察力,有助于...
总的来说,Flex Profile是一个强大的性能分析工具,能够提供实时内存使用情况、函数执行时间以及内存分配的详细信息,帮助开发者定位并优化Flex应用的性能问题。通过熟练使用这个工具,可以显著提升Flex应用的运行...
综上所述,虽然ActionScript虚拟机提供了自动内存管理功能,但在实际开发中仍然需要注意遵循正确的内存管理原则,以避免内存泄漏问题的发生。通过遵循上述原则和最佳实践,可以显著提高应用程序的稳定性和性能。
针对Flex应用中的内存泄露问题,可以采取以下几种方法进行解决: 1. **检查循环引用**:确保所有的对象引用在不再需要时能够被正确地释放。特别注意检查循环引用的问题。 2. **使用工具辅助分析**:使用Flex ...
9.3 Flash Builder的内存泄漏分析工具 291 9.4 用于性能查看的Flash的系统API 293 9.5 其他有关内存泄漏的问题 293 9.6 有关提高Flex应用性能的技巧 294 9.7 小结 299 第10章 Flex企业应用开发的其他技术 300 ...
内存问题可能同样影响到使用APE的Flex应用,解决方案与上述相同。 压缩包子文件的文件名列表中的"3.2"和"3.3"可能是版本号,暗示了问题可能出现在特定的Flex SDK或IDE版本中。检查和升级到最新版本可能有助于解决...