【问题标题】:How to tell how much memory an Android app has left to use?如何判断 Android 应用程序还剩多少内存可用?
【发布时间】:2011-01-18 15:55:22
【问题描述】:

我正在编写一个图像处理工具,出于图像质量的原因,我希望将图像编辑为尽可能大的尺寸。

我需要小心,不要在我的应用程序运行时耗尽内存。此外,我想利用具有大量内存的设备。例如,我想在 G1 等功能较弱的设备上支持中等尺寸的图像,而让三星 Galaxy S 等功能更强大的设备支持大图像。

是否有可靠的方法来衡量我的应用可以使用多少内存?

我目前的想法是,在决定要加载的图像大小时,设备可以计算使应用程序的内存使用率尽可能接近 70% 的图像大小(即不是 100%,因为你没有希望应用程序稍后在小分配时崩溃或由于内存碎片)

我发现我可以使用以下代码返回可用内存的百分比:

double totalMemoryUsed = (Runtime.getRuntime().totalMemory() + android.os.Debug.getNativeHeapAllocatedSize());
int percentUsed = (int)(totalMemoryUsed / Runtime.getRuntime().maxMemory() * 100);

新位图添加到本机堆分配部分。这似乎是可靠的,因为当 percentUsed 超过 100% 时,我的应用程序会因内存不足错误而崩溃。我需要注意上述计算的任何注意事项吗?

【问题讨论】:

  • 我会担心的是一切正常,然后 android 不明智地决定恢复以前资源被杀死的后台进程并导致您的应用程序因此崩溃。
  • 你的计算对我来说没有意义。恕我直言,您应该使用Runtime.freeMemory()Runtime.totalMemory() 的组合。如果您使用的是 Debug.getNativeHeapAllocatedSize(),您可能会计算两次,请参阅stackoverflow.com/questions/1945142/bitmaps-in-android/… 澄清 Runtime.totalMemory() 是您的程序可用的数量,而 maxMemory() 是 VM 可用的数量。

标签: java android image-processing mobile


【解决方案1】:

以上有什么注意事项吗 我需要注意的计算?

我的第一个想法是,你真的只能在你执行它的那一刻依赖这样的计算的准确性。 Android 具有在后台运行的各种服务和其他应用程序。在任何给定时刻,当前使用的内存量都会发生变化。在您再次执行计算之前,无法知道多少。此外,没有两部手机是一样的,所以你真的无法准确估计。

您几乎需要一个线程或异步任务来不断地重新计算它,我不确定这是一个好主意。

我会偏离这一点,并考虑使用不同的策略来构建您的应用程序。但如果你继续追求它,祝你好运。

【讨论】:

  • 然而,在当前应用程序的最大内存中返回的最大内存参数(当您的应用程序超过此值时,它会被杀死)。例如,在 G1 上,每个应用程序限制为 16Mb。无论后台运行什么,这都不会改变。
猜你喜欢
  • 2010-09-19
  • 1970-01-01
  • 2018-03-07
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多