我正在研究如何减少代码中的内存使用量,并且知道删除组件也会删除其中存在的子组件。如果发生这种情况,内存使用量必须减少但它正在增加。我有一个包含 hbox 的标题窗口,这些 hbox 有画布作为包含图像的子级。现在,如果我使用removeChild(titlewindow)
它中存在的所有 hbox、画布和图像是否被删除?如果被删除,内存使用量是否会减少?我怎么能在 flex 中做到这一点?
2 回答
是的,几乎所有东西都被它删除了,只要你设置了titleWindow
to的值null
并且永远不要重新添加那些孩子。至于这是否清空内存,基本上是在两种情况下:
垃圾收集器随后运行。 这可能很昂贵,因此 Adobe 将其设计为不一定只是定期反复发生。相反,当 Flash Player 或 AIR 耗尽其当前堆中的内存时,往往会发生这种情况,此时垃圾收集器将首先检查它是否可以在当前堆中释放足够的空间,然后再从操作中获取更多空间系统。
您在其他任何地方都没有对这些孩子的任何非孤立引用。 通过“非孤立”,我的意思是,如果您仍然引用它们的唯一地方是它们自己,而在您的程序的其余部分没有任何引用,那么这个条件仍然满足。
这条规则至少有一个例外,那就是垃圾收集器可以将程序中的多个对象挑出为GCRoots
. AGCRoot
永远不会被垃圾收集,期间。因此,如果您将 a 孤立出来GCRoot
(使其及其任何后代都没有任何引用),那么垃圾收集器基本上不在乎。这GCRoot
将保留在那里,因此它对任何对象的任何引用都被认为是活动的和活动的。此外,在某些情况下,垃圾收集器根本无法判断内存中的某些内容是否是引用,因此它只会假设它是引用并且可能无法删除某些内容。通常这不是问题,但如果您的程序足够大并且没有进行大量对象池,我可以根据经验告诉您,在极少数情况下专门对此做出反应是必要的。
删除它们后尝试将 titlewindow 设置为 null:
removeChild(titlewindow);
titlewindow = null;
如果您的主代码中不再引用它们,垃圾收集器将从内存中删除所有框。只要对它们的唯一引用来自父级,就可以忽略显式删除子级,即 titlewindow 及其子级是一组孤立的对象。但请确保您还删除了任何可能已注册到的任何事件侦听器removeEventListener()
。
此外,不能保证垃圾收集器何时真正运行,所以如果你的内存看起来正在增加,那可能只是意味着 GC 还没有机会清理内存。这是一个关于如何强制 GC 运行的问题。(调试时,System.gc()
通常对我有用)。