当前位置:  开发笔记 > 编程语言 > 正文

什么是垃圾收集,你如何在ActionScript 3.0中做到这一点?

如何解决《什么是垃圾收集,你如何在ActionScript3.0中做到这一点?》经验,为你挑选了1个好方法。

我已经在ActionScript中编程了大约6年,但在AS3问世之前从未听说过"垃圾收集"一词.为什么我们现在要担心它,而且从来没有这样做过?究竟是什么呢?从我读过/听过,它是与内存管理/泄漏等-甚至我不明白许多,除了它是与性能.

我最近为我的一位艺术家朋友推出了一个网站,它是在AS3中完成的.我注意到它占用了大量资源.显然,这是我想要改进的.我猜它与没有垃圾收集的事实有关?!不幸的是,我对从哪开始就没有任何想法,因为我觉得我需要更好地了解它是什么以及如何在AS3中专门做到这一点.

对于好奇,这里是URL:http://www.jeffperrott.com



1> Chadwick..:

垃圾收集器是运行时(在您的情况下是Flash或AIR播放器)中清除未使用内存的一部分.ActionScript总是像所有脚本语言一样拥有垃圾收集(例如javascript,perl,ruby等等).你只是没有看到它为AS讨论过多.

基本思想是创建的每个对象都需要一些内存,而变量会引用这些对象.在没有对它的引用之前,对象的内存不会"释放"回可用内存池.垃圾收集器跟踪哪些对象具有对它们的引用,并且以不同的间隔将回收具有零引用的那些内存(即没有指向它的变量,因此没有代码甚至可以找到它来使用它).如果有任何引用*,则无法回收对象的内存,以防代码的某些部分决定将来使用它.

如果您的程序看起来是在泄漏内存(不断增长,从不稳定大小或缩小),那么您可能将对象放在散列或数组或其他一些集合对象中.这个对象显然保留了对它内容的引用,因此永远不会删除这些内容.

请注意,在ActionScript中,通过将闭包用作事件处理程序,可以很容易地创建"泄漏".如果您的处理程序可以访问已分配但从未为空的变量,那么这些变量将保留其引用,并且只要注册了事件处理程序,它们指向的对象就不会被垃圾回收.

function registerHandler(neverReleased:Object) {
    ...
    addEventHandler(function (e:Event) {
            ...
        });
}

直接调用垃圾收集器几乎总是坏事(tm),Flash/Flex中的垃圾收集器非常好.首先找出对象的保存位置,然后释放它们,让GC按照自己的计划进行操作.

*除了循环引用外,这个答案的范围有点远.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有