我正在开发一个AS3应用程序,它有一些我无法找到的内存泄漏,所以我想问一些关于内存管理的新手问题。
想象一下,我有一个名为BaseClass的类,以及一些扩展此类的类,如ClassA,ClassB等。
我声明了一个变量:
myBaseClass:BaseClass = new ClassA();
过了一会儿,我用它来实例化一个新对象:
myBaseClass = new ClassB();
之后的某个时间
myBaseClass = new ClassC();
并且每个x毫秒都会发生同样的事情,由计时器触发。
这里有记忆问题吗?垃圾收集器是否正确删除了未使用的实例?
谢谢!
答案 0 :(得分:1)
假设您有否对该实例的其他引用(或者可能是其内容),垃圾收集器将清理它们。但是,据我所知,清理之前的时间是不确定的(可能会有一些困难的时间表在使用,但我从来没有看到它记录在案)。如果您正在创建大量实例,那么在第一次清理之前可能会占用大量内存。
有一个AS调用(其名称目前在逃避我)以强制GC运行,但通常不需要它。如果您认为有必要,您几乎肯定需要重新考虑您的应用程序的工作方式。
答案 1 :(得分:0)
如果myBaseClass是唯一存储的
引用new ClassA()
并为myBaseClass指定其他内容
new ClassB()
然后将没有指向ClassA的引用,垃圾收集器应该在运行时找到它。
但是,如果你将myBaseClass提供给存储它自己对该对象的引用的库或类,当你重新分配myBaseClass时,仍然会有一个指向ClassA的引用,垃圾收集器不会清理它,创建一个内存泄漏。通常,编写良好的库将为您提供删除引用的方法。 e.g。
var child:Sprite = new Sprite()
// one reference to the new Sprite
stage.addChild(child); // assume stage stores reference
// two references to the new Sprite
/**
* assume the following:
*
* child = null;
*
* one reference would still remain in stage
* garbage collector will not clean up the sprite
*/
stage.removeChild(child); // assume stage clears reference
// one reference left
child = null;
// no reference to the sprite, garbage collector will clean it up
希望这会让事情变得清晰起来。基本上你想跟踪一个对象有多少引用,如果你怀疑它是在泄漏内存。
我知道FlashDevelop有一个分析器,对于发现这些错误非常有用。此外,您需要知道当垃圾收集器运行时...它将释放内存并为您的内存分析器提供锯齿图案。