NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论

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

ARTS打卡 第13周

引花眠

微服务 ARTS 打卡计划

架构师训练营 - 第 8 周学习总结

红了哟

我与游戏相伴【自我访谈2】

叶阳夏烟

系列 游戏 访谈录 剧情游戏 仙剑奇侠传

从Vessel到二代裸金属容器,云原生的新一波技术浪潮涌向何处?

华为云开发者联盟

Docker 容器 云原生 k8s Vessel

你期待的薪酬是多少?

escray

学习 面试

Docker 安装及配置镜像加速

哈喽沃德先生

Docker 容器 微服务

ARTS Week13

时之虫

ARTS 打卡计划

Java中的一些限制

xiaoxi666

ARTS打卡(20.08.17-20.08.23)

小王同学

Python代码调试指南

王坤祥

Python Python基础

rockchip的yocto编译环境搭建

良知犹存

Linux yocto rockchip

浅谈 GET 和 POST 区别

叉叉敌

面试 post GET

速看!今天我才知道,UUID还分五个版本

麦洛

Java uuid

大数据技术思想入门(三):分布式文件存储的流程

cristal

Java 大数据 hadoop 分布式

Newbe.Claptrap 框架入门,第三步 —— 定义 Claptrap,管理商品库存

newbe36524

Docker 云计算 微服务 .net core ASP.NET Core

关于Aborted connection告警日志的分析

Simon

MySQL MySQL错误日志

要刷LeetCode了,才发现自己连时间复杂度都不懂

大头星

算法 LeetCode

顺时针遍历矩阵,提高系统高并发350倍,React Native原理浅析 组件设计原则 安全架构 防火墙ModSecurity John 易筋 ARTS 打卡 Week 14

John(易筋)

ARTS 打卡计划 组件设计原则 React Native 高并发优化

一家估值20亿美元的公司,竟然没有办公室?

Atlassian

远程办公 Atlassian Jira

架构师训练营第十一周作业

Melo

ARTS打卡Week 11

teoking

MacOS抓包工具Charles

叉叉敌

ios charles 抓包

disruptor 高性能队列最佳选择

柿子

队列 disruptoer 高性能队列

1.Flink任务之间通信开销-6

小知识点

scala 大数据 flink

看智微智能互动录播系统如何建设“三个课堂”

InfoQ_967a83c6d0d7

“深化产教融合·共育数字人才”全国产教融合信息化高峰论坛·江苏站成功举办

InfoQ_967a83c6d0d7

【Elasticsearch 技术分享】—— ES 常用名词及结构

程序员小航

Java 搜索引擎 elastic ES Lucene Elastic Search

6. 二十不惑,ObjectMapper使用也不再迷惑

YourBatman

json Jackson ObjectMapper

Java ForEach语句判断是否为空

引花眠

bug

想不出来问题的你

escray

学习 面试

想问面试官什么问题么?

escray

学习 面试

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