我编写了一个快速而肮脏的程序,通过反复调用malloc
来泄漏内存。我注意到,当我在调试配置中运行我的程序时(在VS 2012中),我的程序正确地消耗了千兆字节的内存,并一直持续到页面文件满了(Windows任务管理器报告高工作集大小)。然而,当我在发布模式下运行程序时,我的程序的工作集大小仍然很小,但提交大小不断增长。磁盘抖动或页面错误也明显减少。
MSDN文档指出,在调试模式下,malloc
被映射到_malloc_dbg
,但文档还指出,两者都在堆上分配内存,只有_malloc_dbg
分配额外的内存用于调试信息-没有提到不同的堆行为(即为什么它没有出现在私有工作集在发布模式)。
请告诉我发生了什么事?
提交虚拟内存页时,在访问该页之前不会分配物理内存。
调试malloc用已知的模式填充新分配的内存,而释放malloc不初始化它。
初始化导致在调试中比在发布中需要更多的物理RAM页(和更多的抖动)。
如果您要实际触摸分配的内存的每一页,我希望这两个构建之间的大部分差异会消失。