ori*_*zil 6 flash garbage-collection actionscript-3
道歉,如果这是一个骗局; 我找不到它.
我已经在AS3垃圾收集器上阅读并理解了grant skinner的博客 - http://www.adobe.ca/devnet/flashplayer/articles/garbage_collection.html,但我的问题不在那里.
这是我的问题.
假设我写了一些AS3代码,如:
statementOne;
statementTwo;
Run Code Online (Sandbox Code Playgroud)
垃圾收集器是否有可能在我的两个语句期间或之间运行,或者仅在我的"用户"代码完成并将控制权返回到闪存后运行?
我们有一个有时很慢的A-Star代码块,我想消除GC作为潜在的罪魁祸首.代码块显然比我上面的例子更复杂,但它不涉及任何事件或其他异步的东西.
蒂亚,猎户座
垃圾收集器没有线程,因此一般来说,在代码运行时它不会运行.然而,有一个例外情况并非如此.
该new如果内存用完关键字将调用垃圾收集器.
您可以运行此代码来观察此行为:
var vec:Vector.<*> = new Vector.<*>(9001);
for (;;) {
vec[0] = new Vector.<*>(9001);
vec = vec[0];
}
Run Code Online (Sandbox Code Playgroud)
内存使用率会迅速上升到最大值(对我来说是1GB)然后一直持续到时间中断.
这里有很多好的答案,但我认为一些细微之处尚未得到解决.
最后,关于您的具体问题:根据我的经验,GC不太可能与您的性能问题有关.在循环期间可能会发生引用计数的GC处理,但通常这是一件好事 - 这种集合非常快,并且可以保持内存使用的可管理性.仔细管理您的参考文献的重点是确保这种GC及时发生.
另一方面,如果在循环期间发生标记/扫描,那肯定会影响您的性能.但这是相对难以辨认和易于测试的.如果你在PC上进行测试并且你的应用程序没有经常进入数百MB的内存使用量(测试System.totalMemory),你可能根本就没有得到任何标记/扫描.如果你有它们,应该很容易验证相关的暂停是否很大,不经常,并且总是伴随着内存使用量的大幅下降.如果这些事情不正确,你可以忽视GC是你问题的一部分.