我的朋友实现了一个动态数组来学习C。当内存不足时,他将分配的空间加倍。
我们看到他的测试程序逐个字符地写入了4 GB的随机字符(以避免内存压缩)。但是活动监视器(在Mac上,基于top
)显示内存使用率逐渐增加,而不是每次扩展都增加一倍。
但在删除/压缩后,内存使用量将立即下降,完全与代码释放内存一样。
顶部如何跟踪分配范围内使用的“实际”内存?如果其余分配的空间仍然无法供其他进程使用,为什么还要这样做呢?
答案 0 :(得分:3)
大多数现代操作系统都延迟分配实内存,仅在尝试使用它时才提供内存。您可以在不使用任何内存的情况下根据需要增加堆。唯一的效果就是分配虚拟内存地址。
仅当您实际触摸页面(例如通过写入页面)时,才真正为进程分配内存。
后果之一是,即使没有可用的物理内存,malloc()
也会成功。
如果您实际使用top
,则会看到虚拟内存分配(这只是虚拟地址的分配)和实际使用的内存(“驻留集”)。