【发布时间】:2020-06-25 09:47:35
【问题描述】:
我在 1 秒计时器上运行它:
trace(String(System.totalMemory));
这表明我的应用程序的内存每 5 分钟增加约 1mb,即使它处于休眠状态。
在测试中,当我运行时
System.gc(); System.gc();
在每 1 秒运行 System.totalMemory 的同一函数中,内存立即下降并保持在 8mb 左右。但是,如果我运行
System.gc(); System.gc();
仅一次,内存下降到 8mb,然后继续以之前的速度上升。
为什么我的应用程序在处于休眠状态时会增加它的内存使用量,这是值得担心的事情,还是 System.gc(); System.gc();直接降低内存意味着我没有内存泄漏,我应该让垃圾收集器处理这些事情吗?
谢谢。
【问题讨论】:
-
很可能是后者,因为您的应用程序的占用空间不会从 8MB 增加。但是,可能有一个 Activity 占用了比它应该在应用程序的后台运行更多的资源,从而生成大量事件或其他一次性对象。还要检查您的应用是否会生成一些较重的对象而不是更新它们,例如
BitmapDatas,这些会消耗一些您实际上不会泄漏但可能会重复使用的内存块。 -
谢谢你。我想我在你的问题上误导了。如果我运行 System.gc();系统.gc();只有一次,即不是每秒一次,内存下降到 8mb,但随后继续以之前的速度上升。
-
这里没有太大变化。您的应用程序的未 GC 占用空间不会增加,因此不会发生内存泄漏。我想知道在 5 分钟内是否有足够的 enterframe 事件来积累 1MB 的堆以进行 GC...至少 300*30=9000,许多
Event对象可能占用一兆字节。 -
一些垃圾收集器等到特定数量的内存被占用。所以当这个限制是 200MB 时,你必须等待 16 个小时,直到 GC 会自动减少内存。然而,一些 GC 将此限制设置为 RAM 的四分之一,因此当您有 16GB 时,限制将是 4GB 或在 GC 发生之前等待 6 天。
-
感谢您提供的信息 - 我现在感觉好多了。我一夜之间打开了应用程序,早上它已经下降到大约 8mb 大关。仍在以相同的速度增长,但只达到 12mb 左右,然后会下降。
标签: actionscript-3 memory-leaks garbage-collection