我正在构建一个相册布局应用程序。该应用程序经常将 JPEG 图像解压缩到内存中的位图缓冲区中。图像的大小限制为 100 兆像素(但通常不超过 15 兆像素)。
有时这些缓冲区的内存分配会失败:[[NSMutableData alloc] initWithLength:]
回报nil
。这似乎发生在系统的可用物理内存接近零的情况下。
我的理解Mac OS X 中的虚拟内存系统这是 64 位进程中的分配吗几乎(原文如此)不能失败。有 16 艾字节的地址空间,我尝试一次最多分配 400 兆字节。理论上,我可以分配 400 亿个这样的缓冲区,而不会达到可用地址空间的硬限制。当然,实际限制会阻止这种情况,因为交换空间受到启动卷大小的限制。事实上,我只进行了很少的分配(少于十次)。
我不明白的是,无论当时的物理内存有多低,分配都会失败。我认为,只要还有剩余的交换空间,内存分配就不会失败(因为此时页面甚至还没有映射)。
该应用程序被垃圾收集。
Edit:
我有时间进一步深入研究这个问题,以下是我的发现:
- 该问题仅发生在垃圾收集过程中。
- 当分配来自
NSMutableData
失败,一个简单的malloc
仍然成功分配相同数量的内存。
- 当总体物理内存接近零(即将发生交换)时,总是会发生该错误。
我假设NSData
uses NSAllocateCollectable
执行分配而不是malloc
在垃圾收集下运行时。
我的结论是,当物理内存较低时,收集器无法分配大块内存。再说一遍,我不明白。
答案在于实施libauto.
从 OS X 10.6 开始,在 64 位平台上为垃圾收集内存分配了 8 GB 的空间。对于大型分配 (>=128k) 和小型 (
因此,在 10.6 中,您有 4Gb 内存可用于大量分配垃圾收集内存。 10.5 时,竞技场的大小为32Gb,但 Apple 将该大小降低至 8Gb10.6.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)