【问题标题】:Android, I see heap growing, but I want it to stopAndroid,我看到堆在增长,但我希望它停止
【发布时间】:2012-01-12 23:24:15
【问题描述】:

我看到我的堆在增长,我知道它最终会在任何设备上崩溃,因为它一直在增长。

Grow heap (frag case)

在整个日志中都可以看到

在我的手机上,它会在使用 32mb 时使应用程序崩溃。其他手机当然是 16mb,如果有运行 android 2.2 的少数资源的话

现在,我在我的位图上使用 recycle(),将内容设置为 null,从复杂的数据结构中弹出项目,并使用 System.gc() 在整个应用程序中调用垃圾收集

但是,堆仍然在增长,这是一个问题......最终

我如何强制应用转储资源以便它可以继续运行。

通常总是超出“位图虚拟机预算”,但我越来越觉得我无法访问“清除位图虚拟机”命令

【问题讨论】:

    标签: android garbage-collection heap-memory


    【解决方案1】:

    我也在这个问题上苦苦挣扎。你可以做很多事情。

    1. 您可以在每个位图上调用 recycle 并将它们设置为 null。(bitmap.recycle() 释放此位图使用的所有内存,但不会使位图对象无效)。

    2. 您还可以取消绑定与此link 中指定的布局关联的drawables

    3. 您可以将hashmaps 转换为WeakHashmaps。这样当系统内存不足时,它的内存就会被释放。

    4. 您可以调整所有位图的大小。看看这个 link.

    5. 您可以在整个系统内存不足时调用活动中的onLowMemory() 方法。你可以在那里释放一些资源。

    6. 您可以将对象设为SoftReferenceWeakreference,以便它们在内存不足的情况下被释放。

    但实际情况是,所有这些都可以延迟您的内存不足问题/崩溃,但无法消除它,因为您必须在某处泄漏您的活动上下文或内存。

    【讨论】:

    • 当我调用 camera.takePicture 时,堆会在回调和我的 savephoto 异步任务之间增长。我一直在寻找所有可以释放的东西,但真正归结为内置的拍照按钮
    • 您可能在其他地方泄漏内存。
    • 我有一个活动,我将如何泄露上下文?在我关闭该活动的每个地方,我都会使用 System.exit(0) 来真正确保它已关闭
    • 泄露上下文并不意味着您的活动不会完全停止/关闭。我认为您可能已经采用了一些不会被破坏的静态变量/对象。(因为它们存储在堆上)。但这些只是猜测......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多