大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

如何分析 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:312629
用户头像

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

关注

评论

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

软件测试/人工智能|Python 数据类型转换解析:理解数据之间的灵活转换

霍格沃兹测试开发学社

解决云电脑无法使用本地终端连接的USB设备

天翼云开发者社区

云计算 云电脑

云电脑:IO虚拟化实现的技术分析

天翼云开发者社区

云计算 虚拟化 云电脑

结算系统开发,直销系统开发,交易所开发,dapp开发,公链开发 商城开发,

Geek_8da502

腾讯云大数据ES荣获信通院优秀案例奖,云原生实力再获认可!

腾讯云大数据

ES

数实融合!低代码推动工业数字化转型走“深”向“实”

优秀

低代码 数字化转型 工业数字化

文心一言 VS 讯飞星火 VS chatgpt (149)-- 算法导论12.2 4题

福大大架构师每日一题

福大大架构师每日一题

每日一题:LeetCode-76. 最小覆盖子串

Geek_4z9ami

面试 算法 LeetCode 刷题 字符串

开源 | Spark Commiter 深度解读:Apache Spark Native Engine

网易数帆

大数据 spark 开源 Gluten

2023Q4 私有化版本发布,和鲸 ModelWhale 持续赋能大科研、高校教改的 AI for Science

ModelWhale

人工智能 云计算 数据分析 超算 私有化部署

Spring Boot 项目代码混淆实战:保护代码安全,防止泄露

重磅!天翼云斩获2023年中国通信学会科学技术奖一等奖

天翼云开发者社区

云计算

如何实现通过API接口对商品信息进行实时更新和维护?

技术冰糖葫芦

API 文档

一文读懂 ChatGPT 工作原理

秃头小帅oi

低代码 AIGC ChatGPT

Amoro 试用&贡献活动 | 10月社区评选揭晓

Amoro Community

大数据 开源 湖仓一体

【哈尔滨学院主办】第三届高性能计算与通信工程国际学术会议(HPCCE 2023)

搞科研的小刘

通信 计算机 高性能计算 通信工程

Netty源码学习7——netty是如何发送数据的

不在线第一只蜗牛

学习 源码 Netty

分享一个LCD驱动框架

不在线第一只蜗牛

教程 开发框架 lcd

VPN证书过期问题梳理

Lane

特权账号管理之医疗行业篇

尚思卓越

数据库 运维 网络安全

11 | 排序(上):为什么插入排序比冒泡排序更受欢迎

鲁米

安全加密传输大文件对金融行业的意义以及重要性

镭速

大文件传输 加密传输大文件

最新大文件传输解决方案,一站式解决网站文件上传下载速度慢问题

镭速

大文件传输

Java医院绩效考核系统源码支持二次开发

源码星辰

Java

如何撰写How-To文章:7个高效步骤(新手SEOer向导)

九凌网络

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