我正在使用AS3和FlashDevelop,我似乎无法说服我的FlashPlayer / AVM到GC。
我尝试了相当标准的选项:
myboolean = null;
delete(myboolean);
但是对于null,它表示“col:14警告:null用于预期布尔值的位置。” 并删除我得到“col:11错误:尝试删除固定属性allDone。只能删除动态定义的属性。”
这是考虑布尔在一个方法中定义如下:
var myBoolean:Boolean = false;
我很感激,因为它在方法中,当它运行时它当然应该被垃圾收集,但我喜欢确定,为什么我不能GC布尔当我为int做同样的, Array和Point在同一个类的另一个方法中?布尔也不是一个对象吗?
所以,如果有人知道怎么GC布尔值,请告诉我。
答案 0 :(得分:2)
基本上像Jonatan Hedborg这样说你不直接控制什么是垃圾收集。
我的猜测是你来自c / c ++背景或类似的东西,你负责更严格和直接地维护内存,这与AS3和Java不完全相同;尽管内存管理仍然非常重要,但它在对象级别处理得更多。虽然布尔值从Object读取延伸到原始类型:
空数据类型Null数据类型只包含一个值null。这个 是String数据类型和所有类的默认值 定义复杂的数据类型,包括Object类。没有任何一个 其他原始数据类型,例如Boolean,Number,int和uint, 包含值null。 Flash Player和Adobe AIR将转换 如果尝试分配,则将null值设置为适当的默认值 null为Boolean,Number,int或uint类型的变量。你不能 将此数据类型用作类型注释。
在这两种情况下,您都有一些机制,例如对所有活动对象的图形中的对象进行分离引用,这意味着它们将在垃圾收集器的下一次计划运行时被垃圾收集(可以强制它但是它不是真的推荐,在这种情况下,JVM或AVM的配置将根据它运行/执行的系统来处理它。
将对象置零将允许它被垃圾收集,但您不应该真正关注单个基元属性。这里有一篇很好的文章解释了AS3中垃圾收集的一些细节(我会留下一个摘要,但整个页面都相当不错,主要观点我认为垃圾收集不一定是100%直接但有一些努力可以管理): http://tomgabob.blogspot.com/2009/11/as3-memory-management.html
基本上它的工作方式是FlashPlayer或运行的任何虚拟机你的(字节)代码都有一个已创建的所有对象的图形,并且有一个当前的引用。
它还具有基于环境(配置等)可以使用的内存限制,因此GC具有算法设置以确定何时应该尝试垃圾收集。您应该主要关注对不再需要的对象的引用进行归零,如果您的应用程序不是很复杂,或者您的硬件对RAM没有太大的限制,那么这实际上并不算太大。
所以问题不应该是让GC运行得太少或太多,而是创建永远不会删除的引用(添加Listeners而不是从应该收集的对象中删除,或者只是在集合中引用它们等等)他们不再需要了)。上面的文章再次对此进行了更深入的解释。
答案 1 :(得分:0)
你在哪里使用布尔值?确保基元是GC的唯一方法是确保收集它所使用的类。
答案 2 :(得分:0)
您的推理中有2个错误: