问题描述:
本人运行在阿里云ecs服务器上的程序最近连续不定期崩溃。错误日志打印为fatal error: runtime: cannot map pages in arena address space或者fatal error: runtime: failed to commit pages,都是显示内存崩溃的问题。但查看任务管理器,内存占用仅为3点多G,服务器配置是Windows server2008 r2 64位 8G内存。明明空闲多半内存,但程序依旧奔溃。最开始是程序启动时(用的revel 框架写的服务器),热编译提示内存不足,关闭部分在运行程序腾出内存空间后可正常编译运行。最近是程序运行时会崩溃。无奈只能硬着头皮查找原因。
网上遇到类似问题的解答大致有如下。
1,32位系统,仅支持最大4g内存,解决方法自然是换64位系统
2,程序构建版本是32位(本人用的golang语言程序64位,这个解答本人未证实是否真有影响)
3.系统限制单进程内存申请,这个通常在程序启动时弹错误out of memory,修复方法是cmd运行"Bcdedit /set IncreaseUserVa 3072"最后参数为限制的内存大小。
4.物理内存过小,同时虚拟内存过小,解决方法是加大物理内存或加大虚拟内存设置。
本人遇到的情况,上述原因均可排除。于是在下就头大了。只能各种尝试。写了个简单的测试程序,单纯循环申请内存,逐步扩大内存占用。复现了此程序错误,系统内存一旦用量达到3.8g左右,程序就gg。
后来在下思考,既然你不让我用物理内存,但我内存肯定是要用的,那我就只能设置虚拟内存了。因为此时系统是未设置虚拟内存的,理论上来讲,物理内存足够的情况下是不需要设置虚拟内存的,虚拟内存的出现就是为了解决物理内存不足的情况。
当我设定完虚拟内存后,奇迹出现了。利用测试程序,任务管理器显示物理内存终于突破了4g。至此,问题得以解决。
总结,Windows个坑爹货,为何一定要设置虚拟内存才能正常申请物理内存。使用Windows服务器的还是设置一下吧,避免和我一样掉坑,阿里云ecs默认是禁用的。