1
2
Flash的垃圾收集只清除引用计数为零或引用较弱的元素/对象/变量。 这意味着你需要这么做。才是真正的gc。
|
2
5
关于你的更新,我认为你误解了GC的工作原理。基本思想相当简单。 创建对象时,flash会在名为堆的存储器中分配一些内存。返回对此对象的引用。这个引用就是您存储在变量中的内容。什么是参考?访问此对象的方法。把它看作是与对象的链接。
现在,在某些语言中,在某个时刻,当您完成此对象时,必须释放为其分配的内存,否则会出现内存泄漏。 在GC环境中,这是自动完成的。当然,你需要一些规则。这些规则根据具体的GC而有所不同,但一般来说,可以说GC确定对象在不再可访问时是可收集的。这是有道理的,因为如果你够不到一个物体,你就不能使用它。你失去了和它的联系。所以,它被认为是垃圾,最终会被收集起来。 如何确定可达性的细节各不相同,但在flash中,它是参考计数和标记扫描算法的混合。 (以下只是一个高级概述,细节可能不太准确) 一种方法是引用计数:它简单快速,但并不适用于所有情况。基本上,每个对象都有一个引用计数。每次将此对象分配给变量(即存储对该对象的引用)时,引用计数都会递增。每次您丢失这个引用(例如,您清空var),这个计数就会递减。如果计数达到0,则表示对象不可访问,因此它是可收集的。 这在某些情况下很好,但在其他情况下不行。特别是当有交叉引用时。
如您所见,Bar 1和Bar 2的RC都为1,但都是不可到达的。这是引用计数不起作用的情况之一。因为无论出于何种目的,这两个对象都是不可访问的,而且不会被收集。 这就是为什么有标记/扫描算法。从高层次的角度来看,它所做的是遍历对象图,从一些根对象开始,分析其关系以确定对象是否可访问。此算法将确定,即使Bar 1和Bar 2的RC为1,但它们是不可到达的,因此应被视为垃圾,并在某个点进行收集。 事件、侦听器和分派器的工作方式相同。他们不是特例。当你这样做时:
这和做一样:
结果是foo1现在引用了
1) 你不再想要了
很多人坚持使用弱引用,因为他们认为这样你就可以假装不必打电话给
现在,在这段相当长的(但希望是建设性的)咆哮之后,让我们看看您的代码: 不会收集您的精灵,因为它有两个引用:
1) 那个
第一个遵循上述规则大纲。第二个也是,但乍一看可能不那么明显。但如果你想一想就明白了。当你这么做的时候:
所以,如果你在某个时候按照肖恩·塞恩的建议去做:
你的
|
codeforester · 测量GC暂停时间的最佳方法是什么? 6 年前 |
Venki WAR · 需要解释G1的并行完整GC 6 年前 |
Stephan_Berlin · 为什么CMS系列中的初始标记阶段 6 年前 |
Bonsaisteak · 为什么年轻一代需要三个区域来收集垃圾? 6 年前 |
goks · 如何清除熊猫的数据帧内存? 6 年前 |