fatal error: runtime: cannot map pages in arena address space

本文针对阿里云ECS上运行的程序因内存问题频繁崩溃的现象进行了深入探讨,并通过设置虚拟内存的方法成功解决了这一问题。

问题描述:

本人运行在阿里云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默认是禁用的。

`Fatal error: Uncaught parallel\Runtime\Error: cannot create thread Not enough space` 错误通常表示系统没有足够的资源来创建新的线程,以下是一些可能的解决方法: ### 增加系统资源 - **增加内存**:如果系统物理内存不足,可考虑增加物理内存,以提供更多空间供线程创建和运行。比如对于服务器,可添加内存条。 - **调整交换空间(虚拟内存)**:在 Linux 系统中,可以通过修改 `/etc/fstab` 文件或使用 `mkswap` 和 `swapon` 命令来调整交换空间大小。示例命令如下: ```bash # 创建一个 4G 的交换文件 sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 让系统开机自动挂载交换文件 echo '/swapfile none swap defaults 0 0' | sudo tee -a /etc/fstab ``` ### 优化 PHP 配置 - **减少线程使用**:检查代码中创建线程的逻辑,避免不必要的线程创建。例如,在使用 `parallel` 扩展创建线程时,确保只在必要时创建新线程。以下是一个简单示例: ```php <?php use parallel\Runtime; // 减少不必要的线程创建 if ($someCondition) { $runtime = new Runtime(); $future = $runtime->run(function () { // 线程执行的任务 return "Task completed"; }); $result = $future->value(); echo $result; } ``` - **调整线程池大小**:如果使用了线程池,可适当调整线程池的大小,避免创建过多线程。 ### 检查系统限制 - **检查系统线程限制**:在 Linux 系统中,可以通过 `ulimit -u` 命令查看和调整每个用户可以创建的最大进程数。可以通过修改 `/etc/security/limits.conf` 文件来永久调整限制。示例如下: ```plaintext username hard nproc 4096 username soft nproc 4096 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值