一. 简介
win32 下应用程序的内存最大限制为 2G,如果 new 一块很大的内存即使没有超过系统限制也可能会引发崩溃,因为 new 出来的内存是连续的。
二. 问题现象和跟踪分析
在调试一个内存越界的问题时,开启了 gflags -p /enable *.exe /full,之后进程再也无法启动成功,查看此时进程内存,亦只有 300 多 M,还剩余很多。另外产生的 dump 文件中,显示用户可用内存有 100 多 M。
通过调试发现,此时进程停在了 new 的地方,具体调用栈如图 1:
图 1 异常调用栈
查看 03 帧下 size 大小为 0x20ce7000, 大概为 550 多 M,因为 gflags 设置内存对齐后,需要更大的内存。申请不到,因此程序在此时出现异常。(查看此值大小需要设定操作系统符号文件路径)
图 2 申请内存大小
三. 问题解决
申请的内存大小变小后,未再出现异常。