写点什么

如何分析 Flex 应用的内存泄露问题?

  • 2010-10-26
  • 本文字数:1101 字

    阅读完需:约 4 分钟

随着 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”查找游荡对象,比较不同状态转换之间的对象变化,可能会发现泄露的对象。

当然,凡事应以“预防为主”,所以作者最后总结了几点开发建议:

  1. 对于显式引用,要尽量减少对临时对象的引用,尤其是全局变量、静态变量、使用单例模式创建的变量对临时变量的引用。这些变量包含 stage、systemManager、application、MVC 框架中 Model 和 Controller,还有以 Manager 命名的对象等等。另外,临时变量本身要尽量做到高内聚性,对象内部尽量减少对外部对象尤其是全局对象的依赖。
  2. 对于隐式引用,使用弱引用方式注册事件监听器,将最后一个参数 useWeakReference 设置为 true:a.addEventListener(“Leak”, b.leakHandler, false, 0, true); 这样做的结果是垃圾回收器在做标记时,会忽略 a 对于 b 的引用,如果 b 没有被其他对象引用,垃圾回收器就把它标记为“无效”进而回收,从而避免内存泄露。

内存泄露一直是开发社区普遍关注的问题,即使在虚拟机时代,某些泄露问题仍然值得大家讨论和研究。

2010-10-26 01:312673
用户头像

发布了 501 篇内容, 共 285.2 次阅读, 收获喜欢 64 次。

关注

评论

发布
暂无评论
发现更多内容

Vue.js 与低代码开发:如何实现快速应用构建

伤感汤姆布利柏

低代码+AI!DeepSeek新时代,老板们坐不住了!

引迈信息

沉浸式演示:在新老项目中如何快速上手通义灵码 AI 程序员

阿里巴巴云原生

阿里云 云原生 通义灵码

外贸电商网络与普通网络的差异

Ogcloud

企业组网 企业网络 外贸网络 海外网络专线 海外网络连接

【YashanDB知识库】YashanDB 支持MySQL多表更新语句的解决方法

YashanDB

数据库 yashandb

【YashanDB知识库】从PostgreSQL迁移到YashanDB如何进行数据行数比对

YashanDB

数据库 yashandb

沉浸式演示:在新老项目中如何快速上手通义灵码 AI 程序员

阿里云云效

阿里云 云原生 通义灵码 AI程序员

【YashanDB知识库】使用DataX工具迁移yashan数据到maxcompute

YashanDB

数据库 yashandb

高效前端应用:基于 Vue3 的低代码开发实践

秃头小帅oi

炸裂:SpringAI内置DeepSeek啦!

王磊

音频合成器插件Arturia Analog Lab Pro V for mac直装激活版

小玖_苹果Mac软件

BRASS管乐器演奏插件Arturia Augmented BRASS for mac激活版

小玖_苹果Mac软件

【YashanDB知识库】如何从内存中获取SQL语句的执行计划

YashanDB

数据库 yashandb

找到你的小众市场,打造你的专属产品几个步骤

Immerse

产品 创意 独立开发

案例 | 跨越语言边界:20+种语言的AI图像生成挑战

澳鹏Appen

多模态 大模型 图像生成 小语种 LLM

《王者荣耀》鸿蒙版上线后首次全民竞技之约!无缝流转新体验

最新动态

硬件信息监测软件iStat Menus for mac中文激活版

小玖_苹果Mac软件

优秀的词典工具Eudic欧路词典 for Mac中文激活版

小玖_苹果Mac软件

实用的iPhone数据恢复软件PhoneRescue for iOS中文激活版

小玖_苹果Mac软件

一键部署+限免体验!盘点如何在华为云上体验DeepSeek

华为云开发者联盟

AI 华为云 大模型 昇腾云 DeepSeek

JDK8到JDK17都升级了那些新特性?又有哪些能常用好用的?

不在线第一只蜗牛

Python jdk

人工智能丨个人如何用DeepSeek做副业

测试人

人工智能

普惠AI 如何在 Anolis OS 8 上部署生产可用的 DeepSeek 推理服务

OpenAnolis小助手

AI 操作系统 龙蜥操作系统 Anolis OS DeepSeek

AI+智能财务 | 选择智能月结,即刻获得丝滑结账体验!

用友智能财务

财会

简洁高效的多窗格文件管理器QSpace Pro for mac中文激活版

小玖_苹果Mac软件

基于人工智能技术的图像处理软件Topaz Photo AI for mac激活版

小玖_苹果Mac软件

AMD 锐龙 7 9800X3D 处理器被曝看视频时烧毁

E科讯

英特尔酷睿 Ultra 9 275HX 成为 PassMark 上最快的笔记本处理器

E科讯

如何分析Flex应用的内存泄露问题?_Java_崔康_InfoQ精选文章