我正在处理我的应用中的图像流。有些图像真的很大。因此,在处理图像之前,我需要一种方法来判断是否可以使用剩余的内存来处理它。但我怎么知道我可以使用多少剩余内存?
2013-12-13 11:15:05.966 Total Memory: 505 MB User Memory: 434.3 MB
2013-12-13 11:15:05.967 Virtual: 348.7 MB Resident: 6.3 MB Free: 254.1 MB Inactive: 35 MB Active: 70.7 MB Wired: 70.6 MB
2013-12-13 11:15:57.742 Virtual: 530.2 MB Resident: 95.2 MB Free: 160.6 MB Inactive: 45 MB Active: 74.1 MB Wired: 72 MB
2013-12-13 11:16:41.320 Virtual: 569.2 MB Resident: 88 MB Free: 121 MB Inactive: 46.4 MB Active: 71.8 MB Wired: 76.3 MB
2013-12-13 11:16:46.254 Virtual: 612.9 MB Resident: 88.7 MB Free: 50.2 MB Inactive: 33 MB Active: 64.2 MB Wired: 117.7 MB
2013-12-13 11:16:49.536 Virtual: 525.6 MB Resident: 89.9 MB Free: 3.6 MB Inactive: 33.8 MB Active: 154.3 MB Wired: 71.7 MB
2013-12-13 11:16:50.854 Virtual: 568.9 MB Resident: 90.1 MB Free: 139.5 MB Inactive: 35 MB Active: 64.1 MB Wired: 71.2 MB
2013-12-13 11:16:56.358 Virtual: 613.8 MB Resident: 92.6 MB Free: 51.3 MB Inactive: 35.1 MB Active: 107.1 MB Wired: 71.5 MB
2013-12-13 11:17:05.034 Virtual: 658.4 MB Resident: 83.9 MB Free: 48 MB Inactive: 30.5 MB Active: 62.4 MB Wired: 70.1 MB
2013-12-13 11:17:15.196 Virtual: 587.4 MB Resident: 143.1 MB Free: 194 MB Inactive: 6.2 MB Active: 15.1 MB Wired: 69.5 MB
2013-12-13 11:17:18.483 Virtual: 629.3 MB Resident: 145.2 MB Free: 97.2 MB Inactive: 6.3 MB Active: 47.3 MB Wired: 92.3 MB
2013-12-13 11:17:21.098 Virtual: 675.5 MB Resident: 145.2 MB Free: 52.7 MB Inactive: 24.2 MB Active: 51.6 MB Wired: 69.3 MB
2013-12-13 11:17:22.133 Received memory warning.
2013-12-13 11:17:22.187 Virtual: 711.3 MB Resident: 172.1 MB Free: 36.1 MB Inactive: 20.4 MB Active: 1.8 MB Wired: 114.3 MB
2013-12-13 11:17:22.477 Received memory warning.
2013-12-13 11:17:22.480 Virtual: 568.1 MB Resident: 124.7 MB Free: 194.6 MB Inactive: 20.9 MB Active: 3.3 MB Wired: 112.4 MB
2013-12-13 11:17:22.571 Virtual: 522.6 MB Resident: 36.2 MB Free: 282.4 MB Inactive: 20.9 MB Active: 3.9 MB Wired: 66.8 MB
对于上面的最后一个问题,我尝试仅使用可用内存。我确定这是不对的,因为大部分时间可用内存非常少,我可以使用的东西很容易超过它而没有任何问题。我也尝试过(空闲内存 + 非活动内存)。似乎还不是很正确,因为我可以在我的实验中使用更多而没有问题。这里涉及的一个难点是,当我的应用程序处于活动状态并且需要更多内存时,系统可以杀死其他非活动应用程序,以便为我的应用程在计算我可以使用的剩余内存时,我需要考虑以后节省的金额。
答案 0 :(得分:3)
问题1:
您将虚拟内存与交换概念混淆。这是一个常见的错误。
虚拟内存是映射并可供您的进程访问的地址空间的总量,而不是它直接使用的内存量。
这包括:
mmap
ed文件对应的虚拟地址空间这是占据大部分地址空间使用量的第三个,因为它包含执行代码的只读部分,特别是共享库。操作系统会将其中一些驻留在物理内存中,但可能会在必要时将它们丢弃(它们总是可以根据需要从光盘重新加载)。
交换是将属于进程的脏页写入光盘的过程。 iOS中没有交换功能。相反,iOS要求应用程序通过删除未使用的视图控制器和刷新缓存来减少内存消耗。如果这不能解决问题,它会查找要杀死的进程。使用大量物理内存的进程是主要候选者。
问题2:
有线内存是必须始终映射到物理内存的地址空间。驻留在有线存储器中的东西是:
我不太清楚这里的活动和非活动之间的区别,但一般来说,文件缓存(例如mmap
ed页面)总是第一个在内存压力时重新分配的候选者。在此上下文中, free 页面是操作系统不用于任何内容的页面。所有体面的现代操作系统将始终使用其大多数空闲页面进行文件缓存。页面通常只是免费的,因为其中没有任何缓存。
在您认为所有这些页面都属于您之前,请记住,其中很多页面都充满了应用程序代码。如果需要该代码,它将从磁盘重新加载。
问题3:
由于进程之间的共享,总和是不一致的。这就是共享库节省内存的原因。 Darwin内核依赖于一个简洁的优化,子进程从父进程继承内存映射文件。顶级父进程 - 可能launchd
mmap
是大量常见系统库,从而确保子进程免费获取它们。这解释了每个进程中的大量虚拟地址空间,并解释了它们在~600MB时非常相似的原因。
问题4:
你不能可靠。你唯一的选择就是凭经验做到这一点。换句话说,如果没有您的应用程序导致系统其余部分的性能下降,或者操作系统因使用过多资源而终止,您可以使用多少内存。您甚至不能依赖可用的免费页面来进行短期使用。
答案 1 :(得分:0)
我目前还没有任何方法知道你有多少内存。
但是,iOS确实会让您的应用memory warnings告诉您免费内存非常紧张。如果您的应用程序收到其中一个警告,您应该开始释放内存。
答案 2 :(得分:0)
请参阅Memory Usage Performance Guidelines,尤其是:
当检测到低内存条件时,系统会发送 对所有正在运行的程序(包括您的程序)的低内存警告 应用程序)并可能终止一些后台应用程序(如果 必要的)以缓解记忆压力。如果没有足够的内存 发布 - 可能是因为您的应用程序正在泄漏或仍然存在 消耗太多内存 - 系统可能仍会终止你的 应用
基本上,一旦收到内存不足的通知你就应该释放一些内存,你甚至不关心系统上的可用内存是多少,否则操作系统会在某个时候终止你的应用程序。