如何在移动设备上获取可靠的内存信息?

6
我目前正在开发一款适用于iOS和Android系统的应用程序。该应用程序的核心是采用C++编写,随着时间的推移,所需的内存越来越多。但我希望在尽可能使用更多内存的同时,确保应用程序的稳定性。
当然,要实现这一点,我需要知道仍可使用多少内存。这样,如果我在一段时间后发现需要的内存超出了可用范围,我就可以停止分配内存,而不是被操作系统杀死或崩溃。
问题在于,在阅读和尝试不同的解决方案之后,我感觉动态获取的信息并不够可靠。例如,在iOS上:
[NSProcessInfo processInfo].physicalMemory

这是我读到的一个典型例子/答案,似乎并不可靠。看起来你不能动态获取足够的信息以确保仍有足够的内存,因为如果使用过多内存会在发送警告后某些时候操作系统会杀死应用程序。但它也可以在此之间杀死其他应用程序,因此当我收到第一个时停止似乎不是最优解决方案。
阅读了很多帖子后,我对这个主题有些困惑。是否有一种方法可以动态、可靠地知道iOS/Android上我的应用程序还剩下多少内存?或者来自这些操作系统的内存管理对此太不可预测了?
感谢您的帮助!

3
在Android和iOS中,有内存警告监听器,也许将回调添加到你的C++代码中会很有用。iOS=>https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/PerformanceTips/PerformanceTips.html Android=>https://developer.android.com/training/articles/memory.html - Sulfkain
谢谢Sulfkain。这些回调的唯一问题是它们是不可预测的,因为当你接收到一个回调时,你无法知道还可以使用多少内存。我可以在接收到第一个回调时停止,但我正在尝试尽可能获取更多的内存。 - Matthieu P.
在安卓上阅读我说的那篇文章,搜索标题为“检查应该使用多少内存”的内容。在那里解释了如何获取更多的RAM和可用内存,可能会很有用。在iOS上也许有类似的东西。 - Sulfkain
好的,看起来在Android上可以使用OutOfMemoryError,但我仍然需要检查它的行为。然而,在iOS上没有真正的等价物... - Matthieu P.
1个回答

2

按设计,操作系统禁止您在设备上使用所有物理内存;此外,操作系统和其他正在运行的应用程序的要求意味着您的应用程序可以舒适地使用的内存量会随时间而变化。

因此,询问您剩余多少可用内存并不是非常明智的。您应该设计您的应用程序尽可能少地使用内存,然后进行优化,直到使用的内存少于此。

  • 积极将缓存内容写入磁盘。
  • 监听操作系统提供的内存压力通知。
  • 设计您的应用程序,以便可以从新启动中恢复其最后的UI状态:应用程序启动和任务切换以相同的方式呈现给用户,并且他们不需要知道区别。

如果您使用越来越多的内存,操作系统将尝试终止其他应用程序以为您腾出空间。这意味着,再见Facebook,再见Twitter,再见Mail,再见Contacts。作为结果,您的用户将会注意到,并且由于这个原因,他们将会更少打开您的应用程序或者对它的评价更不利。


你的观点完全正确,我非常同意,尤其是从用户的角度来看。但在我的情况下,问题是我不想为我的应用设定任何固定边界。苹果甚至提供了相应的提示:“避免无界问题集。” - Matthieu P.
嘿,也许不要在一台使用电池并放在口袋里的计算机上运行 :) 但是说真的,当我想要看看到底有多少可用内存时,我设置了一个循环来故意每次泄漏16k的内存,记录迄今为止的计数以及发生的任何内存压力事件。这给了我一些关于内存压力系统行为的指示,但我不想依赖它跨操作系统版本、设备或特定用户环境在某个时间点上。 - damian
呵呵;-) 这很有趣,我目前正在尝试做这件事。你从中得到了什么有用的信息吗?在操作系统关闭应用程序之前发生的任何特定事件/回调函数吗? - Matthieu P.
不,只是一个标准的 UIApplicationDidReceiveMemoryWarningNotification - damian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接