在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

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

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

关注

评论

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

云原生(十九) | Kubernetes篇之Kubernetes(k8s)网络

Lansonli

云原生 k8s 8月月更

龟兔赛跑:如何使用TortoiseSVN客户端和P4EXP

龙智—DevSecOps解决方案

git svn Subversion

汉诺塔(递归+ 非递归版)

Five

算法题 8月月更

Android进阶(十七)Android 布局

No Silver Bullet

android android布局 8月月更

教你如何轻松实现多队伍排队管理【必看】

天天预约

微信小程序 排队 排队工具 #SaaS应用

会场及展位变更通知 | GOPS全球运维大会地址更改,龙智展位更换至#106

龙智—DevSecOps解决方案

gops GOPS全球运维大会

ARMS助力羽如贸易打造全链路可观测最佳实践

阿里巴巴中间件

阿里云 云原生 可观测 Arms 客户案例

技术分享| 应急指挥调度平台需要这些技术支撑

anyRTC开发者

音视频 快对讲 语音对讲 调度系统 视频对讲

面试官问:如何优化高并发相关的业务,你能回答的上来吗?

CRMEB

张宏江谈AI创业:人工智能亟需工程化,创业者大有可为

硬科技星球

买家手册:企业在选择 SBOM 供应商时需要注意什么?

SEAL安全

DevSecOps 开源软件供应链 软件物料清单 SBOM 软件供应链安全

跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算

华为云开发者联盟

人工智能 图像处理 图像 三维

传媒数字化转型思考:小程序是音视频内容的更优载体技术

Speedoooo

小程序 数字化转型 小程序生态 传媒

数字人民币如何影响传统支付?支付厂商数字人民币应用案例征集

易观分析

金融 数字人民币 传统支付

Louvain算法在反作弊上的应用

百度Geek说

大数据 算法

湖南省株洲市有等保测评机构吗?咨询电话多少?

行云管家

网络安全 等保测评 等级测评 株洲

浏览器、负载均衡 、进程内部层...那些你需要掌握的多级缓存

华为云开发者联盟

缓存 前端 浏览器

Seata-php 半年规划

SOFAStack

php 开源 分布式 框架 seata

转转风控「违禁物品识别」 背后的那些事儿

转转技术团队

人工智能’

秒验丨使用简介与应用创建

MobTech袤博科技

android iOS SDK 秒验

使用 HTML、CSS 和 JavaScript 的简单模拟时钟

海拥(haiyong.site)

开源 8月月更

今天4点,开发者关心的SysOM 操作系统运维系列直播又来了!| 第 42 期

OpenAnolis小助手

操作系统 系统运维 sig 龙蜥大讲堂 SysOM

程序员常用的IDE工具,你了解哪些?

Speedoooo

小程序 ide 开发者工具 前端开发工具

用小程序打造超级App,助力社交电商扩大“留量池”

Speedoooo

小程序 社交电商 超级app 用户留存

数据构造那些事儿

转转技术团队

测试左移 测试数据构造 测试提效

ITIL4实用指南 | ITSM的未来属于敏捷

龙智—DevSecOps解决方案

ITSM ITSM解决方案

干净代码(Clean Code)实践如何帮助您留住开发人才

龙智—DevSecOps解决方案

代码质量 代码安全

惊呆了!有了这份MySQL笔记手册,胜过看10本书

冉然学Java

MySQL 编程 程序员 分布式 构架

SpringBoot进阶(叁):Spring Boot启动过程分析

No Silver Bullet

spring-boot 8月月更

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