C 程序堆大小?

C 程序堆大小?,c,unix,memory-management,C,Unix,Memory Management,在C语言中,程序的最大堆大小是固定的吗?或者如果我继续malloc,它会在某个时候开始溢出吗 代码: 我正在ubuntu/linux中使用gcc,如果这很重要的话。 我知道一些类似getrlimit的东西,但不确定它是否给出了堆大小。尽管它确实为输入参数中的一个选项提供了默认堆栈大小。 另外,正如这里所建议的,valgrind可能是一个很好的工具,但是如果出现堆溢出,我想动态打印一条错误消息。 我的理解是操作系统分配的进程地址空间(如果它想使用整个内存,实际上是允许的)在进程创建的开始阶段,但我

在C语言中,程序的最大堆大小是固定的吗?或者如果我继续malloc,它会在某个时候开始溢出吗

代码:

我正在ubuntu/linux中使用gcc,如果这很重要的话。 我知道一些类似getrlimit的东西,但不确定它是否给出了堆大小。尽管它确实为输入参数中的一个选项提供了默认堆栈大小。 另外,正如这里所建议的,valgrind可能是一个很好的工具,但是如果出现堆溢出,我想动态打印一条错误消息。
我的理解是操作系统分配的进程地址空间(如果它想使用整个内存,实际上是允许的)在进程创建的开始阶段,但我不确定一旦它请求额外的内存,是否会动态地为它提供更多的物理内存。

堆不会溢出,它只是在某个点(通常是
malloc()
返回
NULL
)内存不足因此,要检测内存不足,只需检查
malloc()
调用的返回值

if (newuser == NULL)
{
    printf("OOM\n");
    exit(1); /* exit if you want or can't handle being OOM */
}

malloc()
内部将从操作系统请求更多内存,因此它会动态扩展,因此它的大小不是固定的,因为它会将不再需要的页面返回给操作系统,并在需要的任何给定时间请求更多的页面。

在某一点上,
malloc()
将返回
NULL
,当系统内存不足时。然后,当您尝试取消引用时,您的程序将中止执行


查看几次执行
malloc(SIZE\u MAX)
时会发生什么:-)

从技术上讲,malloc在大多数系统上分配的不是内存,而是地址空间。在现代系统中,可以使用malloc轻松分配数PB的地址空间,malloc可能总是返回非空指针。这背后的原因是,大多数操作系统实际上只有在主动修改地址空间时才执行内存分配。只要它未被触动,操作系统就会注意到进程地址空间的某个区域已被有效地保留以供将来使用

这种行为称为“内存过度使用”,在维护Linux系统时非常重要。如果发生这种情况,在一段时间内分配的内存超过了可用内存,那么一些程序实际上会写入一些过度限制的内存。然后发生的事情是,所谓的“内存不足杀手”(OOM杀手)会大发雷霆,杀死它认为最合适的进程;不幸的是,通常是那些在任何情况下都不想放松的过程。众所周知,数据库是OOM杀手的主要目标之一


因此,强烈建议在高可用性Linux设备上切换内存过度使用。禁用内存过度使用时,每个地址空间请求都必须由内存支持。在这种情况下,如果请求不能被完全填充,malloc实际上会返回0。

唉,一些系统(如Linux)会过度提交,这意味着
malloc
在应该返回时可能不会返回
NULL
,而当您尝试使用过度提交的内存时,会调用OOM killer。@dmckee旧的Linux OOM killer,这是由于零页面和按需分配,当第一次访问页面时,页面将出现故障。我不确定是否有办法解决这个问题(也许
MAP\u POPULATE
flag for
mmap
?),您显然可以禁用Overmit。不确定是在启动时,还是什么?用谷歌搜索
禁用linux Overmit
会发现很多问题links@dmckee我不建议这样做,除非你想让一半的程序停止运行。按需分配适用于基于java的进程,在这些进程中,java决定一次分配大量内存,而从不使用它。从技术上讲,任何过度占用内存的操作都将停止运行(无论如何几乎所有操作)。SIZE_MAX几乎肯定会在第一次出现故障,因为这往往是该处理器(模式)中的整个可寻址范围,这意味着堆无法处理这一问题。这是地址空间不足的应用程序的问题(通常是基于java的)在某些情况下会消耗系统上大部分的可用内存,而实际上并不使用它。@JesusRamos:原因是,表现出这种行为的程序会用一些值初始化分配的地址空间。操作系统将此视为内存修改,然后会为其分配实际内存。
if (newuser == NULL)
{
    printf("OOM\n");
    exit(1); /* exit if you want or can't handle being OOM */
}