这只是出于好奇。
例如,假设我们用完了8个字节的内存中的2个:
[xx------]
如果我调用new / malloc请求3个字节,它应该可以正常工作,也许像这样:
[xx--xxx-]
如果我调用new / malloc请求另外3个字节,那会发生什么?就可用内存而言,即使它们不是连续的,仍有3个空闲字节。然后,程序会“整理”内存以为新分配腾出空间吗?听起来是不可能的,因为我仍将继续引用现有的alloc。
如果是这样,那么扩展到一个极端的情况,如果您的内存 最终超级碎片化(例如,每隔一个字节分配ala [x-x-x-x- x-x-x-x-]
) ,这是否意味着即使有50%的可用内存,我也无法分配2个字节?
我认为平台无关紧要吗?
对扩展问题很抱歉,但是在Java / C#等其他语言中也会发生这种情况吗?
答案 0 :(得分:0)
是的,内存可能变得碎片化,无法再分配了。一个好的分配器将在可能的情况下合并释放的块,以限制碎片。
MS .NET托管框架通过间接分配内存块(即通过指向块的指针的指针)来解决此问题。这样,可以将一个块移动到碎片整理内存中,而无需将指针更改为指针。 (由于.NET具有异步运行的垃圾收集器,因此框架采取了一些谨慎措施以避免并发问题。)