gpt4 book ai didi

macos - 在 Mac OS X 上的 64 位进程中,中等大小的内存分配如何失败?

转载 作者:行者123 更新时间:2023-12-04 01:06:30 26 4
gpt4 key购买 nike

我正在构建一个相册布局应用程序。该应用程序经常将 JPEG 图像解压缩到内存中的位图缓冲区中。图像的大小限制为 100 兆像素(而它们通常不超过 15 兆像素)。
有时这些缓冲区的内存分配失败:[[NSMutableData alloc] initWithLength:]返回 nil .这似乎发生在系统的可用物理内存接近零的情况下。
我的理解virtual memory system in Mac OS X是 64 位进程中的分配实际上(原文如此)不会失败。有 16 艾字节的地址空间,我试图一次最多分配 400 兆字节。理论上,我可以分配 400 亿个这样的缓冲区,而不会达到可用地址空间的硬限制。当然,实际限制会阻止这种情况,因为交换空间受引导卷大小的限制。实际上,我只进行了很少的这些分配(少于十个)。
我不明白的是分配失败的事实,无论此时物理内存有多低。我认为——只要还有剩余的交换空间——内存分配就不会失败(因为此时页面甚至没有被映射)。
应用程序被垃圾收集。
编辑:
我有时间深入研究这个问题,以下是我的发现:

  • 该问题仅发生在垃圾收集过程中。
  • 当配置从NSMutableData失败,一个普通的 malloc仍然成功分配相同数量的内存。
  • 当整体物理内存接近零(即将发生交换)时,错误总是发生。

  • 我假设 NSData用途 NSAllocateCollectable执行分配而不是 malloc在垃圾收集下运行时。
    我的结论是,当物理内存不足时,收集器无法分配大块内存。再说一遍,我不明白。

    最佳答案

    答案在于libauto的实现.

    从 OS X 10.6 开始,为 64 位平台上的垃圾收集内存分配了 8 Gb 的空间。对于大型分配 (>=128k) 和小型 (<2048b) 或中型 (<128k) 分配,该领域被减半。

    因此,实际上在 10.6 上,您有 4Gb 的内存可用于大量分配的垃圾收集内存。在 10.5 上,竞技场的大小为 32Gb ,但 Apple 在 10.6 上将该大小降低到 8Gb .

    关于macos - 在 Mac OS X 上的 64 位进程中,中等大小的内存分配如何失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5168465/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com