【问题标题】:Is this a memory leak in my AS3 AIR desktop app, or should I not worry about it?这是我的 AS3 AIR 桌面应用程序中的内存泄漏,还是我不应该担心?
【发布时间】: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


【解决方案1】:

如果您有内存泄漏,您的内存将无缘无故地增加,并且不会被垃圾收集器完全减少。

这将是内存泄漏:

Memory usage: 8 MB
Memory usage: 12 MB
Garbage collection.
Memory usage: 9 MB
Memory usage: 14 MB
Garbage collection.
Memory usage: 10 MB
Memory usage: 16 MB

以此类推,从示例中可以看出,垃圾回收完成后使用的基本内存正在增加。在您的情况下,基本内存为 8 MB,并且不会增加,因此没有泄漏。

当您以垃圾收集器不再需要时无法收集的方式消耗内存时,就会发生泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多