【问题标题】:How to know app going to reach max heap memory?如何知道应用程序将达到最大堆内存?
【发布时间】:2014-10-04 06:56:03
【问题描述】:

我正在制作图像库应用程序,其中包含各种分辨率和大小的图像。 根据我的观察,当应用程序尝试加载大图像时,它会抛出 OutOfMemory。

  1. 如何防止应用程序内存不足?
  2. 有什么方法可以在应用程序因内存不足而崩溃之前获得通知?
  3. 我如何知道应用程序将达到堆容量?

【问题讨论】:

    标签: android memory-management out-of-memory heap-memory


    【解决方案1】:

    getMemoryClass() 可让您估计应用程序中可用的内存量。 getLargeMemoryClass() 为您估计可以分配给应用程序的大堆大小。 因此,首先调试您的应用程序以了解它究竟在哪里抛出异常(行),然后添加日志以查看您获得了多少内存。

    【讨论】:

    【解决方案2】:

    如何防止应用程序内存不足?

    分配更少的内存。例如,对于图像,使用BitmapFactory.Options 上的inSampleSize 之类的内容仅将您需要的内容加载到内存中,而不是整个图像。

    此外,如果您的图像将具有相同的分辨率,请使用 inBitmap 重用已分配的 Bitmap 对象,而不是让它们被垃圾回收。

    有什么方法可以在应用程序因内存不足而崩溃之前获得通知?

    不,因为你不是内存不足。

    我如何知道应用程序将达到堆容量?

    您没有达到“堆容量”。

    Dalvik 的垃圾收集器是一种非压缩(或非移动)垃圾收集器,因此随着时间的推移,您的堆会变得碎片化。 OutOfMemoryError 表示您正在尝试分配没有足够大的单个空闲块的东西。我写了a blog post that explains this a bit more 并解释了新的 ART 运行时将如何在这方面提供帮助。

    【讨论】:

    • 感谢 Commonsware。我正在管理图像的字节 [],并根据要求将字节解码为位图。如果应用程序需要更多内存,我想清理 byte[]。所以我想从系统获取更新,现在你没有足够的内存来加载位图,所以我清除了一些 Array 元素。
    • @RohanPatel:“所以我想从系统获取更新,现在你没有足够的内存来加载位图,所以我清除了一些 Array 元素。” -- 将 Bitmap 逻辑包装在 try/catch 块中并注意 OutOfMemoryError 异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    相关资源
    最近更新 更多