一位程序员声称他的64位Mac程序由于内存碎片而持续耗尽内存。我反驳说,这是不可能的,因为知道程序总共只分配了大约1-2 TB的内存,大多数分配在40-200字节的范围内,即使它们是数百万。
我认为不可能以一种分配请求失败的方式分割64位地址空间,因为内存分配器无法在地址空间中找到所请求大小的空闲间隙。
我的信念是基于几乎整个地址空间(64位)可用的理解。也许它只有62位。
所以我想知道是否有其他限制可能导致他的问题。例如,整个64位地址空间是否真的可用,或者只有更小的地址空间子集可用于分配?或者虚拟页面的总数是否有限制?
Apple的Kernel developer guide似乎没有提供有关此主题的任何信息。
我在How can a moderately sized memory allocation fail in a 64 bit process on Mac OS X?中找到了一些关于限制的提示 - 但是引用不支持大约128 TB的总限制等建议。例如,这个限制是指可以分配给任何进程的总量,还是所有进程的总数,是关于分配的总数,还是可以分配的地址范围?
即,如果128 TB是malloc可以返回的总地址范围,并且如果这是所有进程的一个范围,那么我可以想象这会导致所述问题。但是真的吗?
最终答案可能在darwin源代码中找到。有人抓住它并可以在这里总结一下吗?