问题标签 [enomem]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1339 浏览

c++ - 来自 ::popen() 的 ENOMEM 的原因

我有一个大多数情况下都可以工作的应用程序,但是有一种情况,其中对 ::popen() 的调用出现错误,并且 errno 设置为 ENOMEM。::popen() 的手册页指的是 ::fork() 的页面,该页面本身列出了 ENOMEM,并附有 Linux 上的简短评论:

我想知道我是否真的内存不足,或者可能是文件描述符等其他资源?除了用完系统上的实际内存之外,fork() 可以给 ENOMEM 吗?这是Centos4。

0 投票
0 回答
3142 浏览

winapi - malloc 返回 NULL 并将 errno 设置为 ENOMEM,但有足够的堆空间可用?

我有一种情况,malloc()返回NULL并设置errnoENOMEM. 但是 CRT 堆(可增长的)有大量内存可供使用。时malloc,我的进程内存约为 900 MB。主机进程是在 Sun HotSpot JVM 下执行的 Java 可执行文件。

malloc()我正在做的是 80 兆字节,并且失败了。如果我分配 60 MB,它会成功。之后,分配了 50 MB,然后是另一个,另一个也成功了:显然,我还有很多内存,但是 80 MB 的 malloc 似乎对于操作系统来说太“大”了。

我正在使用具有 4 GB RAM 的 Windows 7 x64 SP1。我的进程是一个 32 位进程,使用 VC++ 2010 SP1 构建。我正在使用低碎片堆,这是 Win 7 上的默认设置 - 我还使用 HeapQueryInformation 进行了验证。我正在使用的 VC2010 C 运行时以这种方式创建堆:

根据文档HeapCreateHeapAlloc将自动调用VirtualAlloc大于 512KB 的块。

malloc()如果这不是内存不足,到底会导致什么失败?是不是我的记忆太碎片化了?我认为 Windows 会自动压缩堆。这真的很奇怪,我以前从未见过这种行为。

另一台装有 32 位 Windows XP SP3 的计算机表现出相同的行为。

谢谢,马丁

0 投票
1 回答
1725 浏览

linux - mmap 返回带有 shm_open 文件对象的 ENOMEM

在 linux 中试验 shm_open 并遇到问题。我经常使用 ftrunc 调整共享内存段的大小,并使用 mmap 重新映射调整后的段。但是,在 20 兆字节左右,我从 mmap 获得了 ENOMEM。

我试图做的事情来解决这个问题:

首先,我发现了这些 sysctl 参数。我重新配置了它们:

(shmall 在页面中指定)

在此之后问题仍然存在。调查导致问题的调整大小的细节表明,对 ftrunc 的调用以调整共享内存对象的大小成功(/dev/shm 中的相应文件具有请求的新大小)。

来自此处的文档http://pubs.opengroup.org/onlinepubs/009695399/functions/mmap.html提出了 ENOMEM errno 的三个可能原因:


[ENOMEM] MAP_FIXED 已指定,范围 [addr,addr+len) 超出进程地址空间允许的范围;或者,如果未指定 MAP_FIXED 并且地址空间中没有足够的空间来影响映射。

[ENOMEM] [ML] [Option Start] 如果 mlockall() 需要,映射无法锁定在内存中,因为它需要的空间超过系统能够提供的空间。[选项结束]

[ENOMEM] [TYM] [Option Start] fildes 指定的类型化内存对象中没有足够的未分配内存资源来分配 len 个字节。[选项结束]


我没有使用 MAP_FIXED 或锁定,/dev/shm 中的图像大小表明第三个原因不是问题。我的 mmap 调用如下所示:

mmap(内存,长度,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0)

其中 mem 最初为 0,此后指成功映射的最后一个地址 mmap。

我发现信息表明 ulimit 设置可能会将可映射的内存限制为单个进程,但我认为问题不在这里。以防万一, ulimit -a 在我的机器上看起来像这样:

我希望这是一个简单的:)

0 投票
2 回答
236 浏览

zlib - gzopen() 导致 ENOMEM 的原因

我有一个程序,其总内存占用约为 100 MiB(VM 大小,在顶部,而在 中停止gdb),它试图使用gzopen. 尽管系统有 6GB 内存完全空闲(甚至不包含缓存),并且文件系统上有大量空间(我知道,那将是 ),但errno设置为时失败。是否有更模糊的问题可能导致这种情况?库中的某些东西是否无缘无故地在千兆字节的内存上分配了千兆字节?ENOMEMENOSPC

请注意,我的 ulimit 设置为无限制。

0 投票
0 回答
725 浏览

c++ - 在 C++ 中使用 popen() 和 system() 调用诊断 ENOMEM

我正在处理用于计算物理的庞大 C++ 代码(我没有编写),它使用system()调用来调用其他可执行文件。有时在模拟过程中,system()即使对于简单的调用,这些调用也会失败,例如system("echo something);当它们失败时,它们会立即返回并返回值 -1。

我创建了一个版本的代码,它使用popen()而不是system()启动这些其他可执行文件。在这个版本中,popen() 失败并且 errno 设置为 12 (ENOMEM)。

这是通过 Torque PBS 系统在运行 CentOS 6.3(通过 ROCKS 6.1)的 96GB RAM 的机器上运行的。

请注意,这种行为有点不常见,但它似乎发生在使用大量内存的模拟中——但远低于可用内存量。

我目前有一个正在运行的模拟,它表现出这种行为。它试图system()每 30 秒调用一次,但失败了,这让我可以监控操作系统内存资源。的内容/proc/meminfo

/proc/5939/status(这是有问题的过程)的内容是

我对如何调试这个问题有点不知所措,特别是因为我无法用较小的模拟重新创建它。我的模拟说它使用了 47GB 内存,而/proc/meminfo显示只有不到 2GB 的 96GB 内存是可用的,并且不应该有任何其他运行使用数十 GB 内存的东西。

这个论坛似乎表明以前的内存错误可能已经损坏了堆。这是一个有效的可能性吗?还有什么可以帮助我缩小这个问题的范围?

0 投票
1 回答
323 浏览

macos - shmget 返回 ENOMEM 12GB 免费

我尝试使用 shmget() 分配 22MB 的共享内存,但它以 errno ENOMEM 退出。top 输出的第一行看起来好像有足够的内存:

该程序运行 OS X 版本 10.8.5。知道原因可能是什么吗?

0 投票
1 回答
118 浏览

linux - 根据可用内存控制分叉的子进程数量

我正在尝试利用 COW 并在 Linux 系统内存允许的范围内分叉尽可能多的子进程。我会启动父进程,直到分叉部分(此时进程正在使用一定数量的内存),然后一次分叉一个子进程,直到 fork 返回 ENOMEM 错误。在这种情况下,我会等待任何一个孩子完成后再分叉一个新的。子进程不会分配任何新内存,只会工作。但这不起作用,我的所有进程都被Linux系统杀死,没有任何内存错误。

最好的方法是什么?

0 投票
5 回答
4059 浏览

c - 是否可以在不继承父进程的虚拟内存空间的情况下分叉一个进程?

由于父进程正在使用大量内存,因此在某些内核过度使用策略配置下可能fork会失败。即使子进程可能只是像 ls 这样的低内存消耗程序。errnoENOMEMexec

为了澄清问题,当 /proc/sys/vm/overcommit_memory 配置为 2 时,(虚拟)内存的分配限制为SWAP + MEMORY * ration(default to 50%). 当一个进程分叉时,由于COW,虚拟内存不会被复制。但是内核仍然需要分配虚拟内存空间。打个比方,fork 就像 malloc(virtual memory space size),不会分配物理内存,写入共享内存会导致复制虚拟内存,分配物理内存。当 overcommit_memory 配置为 2 时,fork 可能会因为虚拟内存空间分配而失败。

在以下情况下,是否可以fork不继承父进程的虚拟内存空间的进程?

  1. 如果子进程调用execfork

  2. 如果子进程没有调用exec并且不会使用父进程中的任何全局或静态变量。例如,子进程只是做一些记录然后退出。

0 投票
1 回答
286 浏览

meteor - 为什么流星 1.0.0 不会运行应用程序但崩溃会产生 enomem?

完全干净地安装了运行 7 个最小 64 位的 Centos OpenVZ 服务器、2 个具有 2Gb ram、2 个 cpu、2gb 交换等的 VPS“切片”,

安装了 virtualmin/webmin 就可以了,只在 iptables 防火墙中进行配置,

没有安装其他应用程序或软件,只运行 yum update,

然后使用 curl 链接下载流星,

按照说明在 /root/ 中运行流星创建命令,

这创建了 myapp 然后 cd myapp 进入 /myapp 目录,运行流星,

反复出现此错误消息崩溃,为什么?

已经在网上搜索过答案,但似乎没有人知道,这是自 2013 年以来流星经常出现的问题,甚至在您研究网络之前,为什么还没有修复?以及为什么让软件“开箱即用”运行如此困难?它的整个前提是它的用户友好性和节省时间的能力,我很想能够使用它并已经报名参加了一些基础培训,真的需要让这个工作!不应该这么难!尤其是在运行教程应用程序时...

感谢您提供的任何帮助和建议,

顶部图像不使用任何内存或资源

0 投票
0 回答
382 浏览

c++ - 用于内存映射文件的 Solaris mmap 使用 ENOMEM 失败

在 Solaris 10 和 Linux 上,我使用 mmap 调用来创建内存映射文件,然后从单独的进程中读取该文件。对于大型内存映射文件,在读取(不写入)期间,我得到了 ENOMEM。可能是什么原因,可以采取什么补救措施或前进的方向?我认为内存映射文件并没有完全占用内存。

我正在使用以下调用:

其中,sz是文件大小,fd是通过 open 打开的文件的文件描述符。

我在尝试为整个空间保留空间时遇到 ENOMEM 失败。

ulimit -a显示:

我可以映射部分文件吗?如果我打开部分文件,那么我可以按需访问全部内容吗?我没有使用setrlimit设置任何限制,所以我想,使用默认值(不知道默认值是什么),我应该增加它吗?请指导。如何将文件映射为较小的块以节省内存的过度使用,从而避免 ENOMEM?