linux malloc的意外行为 #包括 #包括 #包括 #包括 #定义块大小1024*1024 //#定义块大小4096 int main(int argc,char*argv[]) { void*myblock=NULL; 整数计数=0; 而(1) { myblock=malloc(BLOCKSIZE); 如果(!myblock){ 放置(“错误”);中断; } memset(myblock,1,BLOCKSIZE); 计数++; } printf(“当前分配的%d\n”,计数); printf(“结束”); 出口(0); }
当BLOCKSIZE为1024*1024时。一切都好。Malloc返回NULL,循环被中断。程序打印文本并退出。linux malloc的意外行为 #包括 #包括 #包括 #包括 #定义块大小1024*1024 //#定义块大小4096 int main(int argc,char*argv[]) { void*myblock=NULL; 整数计数=0; 而(1) { myblock=malloc(BLOCKSIZE); 如果(!myblock){ 放置(“错误”);中断; } memset(myblock,1,BLOCKSIZE); 计数++; } printf(“当前分配的%d\n”,计数); printf(“结束”); 出口(0); },linux,null,malloc,Linux,Null,Malloc,当BLOCKSIZE为1024*1024时。一切都好。Malloc返回NULL,循环被中断。程序打印文本并退出。 当BLOCKSIZE为4096时 Malloc从不返回空程序崩溃。=>内存不足,被内核杀死。 为什么? 它漆黑一片,你很可能会被一个杀人凶手吃掉 Linux有一个称为A的东西,当它发现内存分配非常繁重时,它会随意终止进程。选择要终止哪个进程是基于每个进程的某些属性(例如分配大量内存的进程是主要候选进程) 它做到了这一点,部分原因是它的乐观内存分配策略(无论设备上是否有足够的后备内存,
当BLOCKSIZE为4096时 Malloc从不返回空程序崩溃。=>内存不足,被内核杀死。 为什么? 它漆黑一片,你很可能会被一个杀人凶手吃掉 Linux有一个称为A的东西,当它发现内存分配非常繁重时,它会随意终止进程。选择要终止哪个进程是基于每个进程的某些属性(例如分配大量内存的进程是主要候选进程) 它做到了这一点,部分原因是它的乐观内存分配策略(无论设备上是否有足够的后备内存,它通常都会为您提供地址空间,称为Overmit) 在这种情况下,当一次分配1M时,很可能在OOM杀手找到你之前分配失败。对于4K,在分配例程确定您已经受够之前,您就被发现了 如果您愿意,您可以通过在
procfs
中的OOM_adj
条目中写入调整值-17
,将OOM killer配置为不打扰您。除非您知道自己在做什么,否则这是不可取的,因为这会使其他(可能更重要的)流程处于风险之中。从-16
到+15
的其他值调整您的流程被选择的可能性
您还可以通过将
vm.overmit_memory=2
写入/etc/sysctl.conf
来完全关闭overmit,但这同样会在您的环境中出现问题。malloc仅在无法分配内存时返回NULL。当你降低块大小时,你可以分配所有的块,因为你从来没有释放过它们,你会得到一个OOM错误。程序员:分配内存。Linux:什么,赤手空拳?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<pthread.h>
#define BLOCKSIZE 1024*1024
// #define BLOCKSIZE 4096
int main (int argc, char *argv[])
{
void *myblock = NULL;
int count = 0;
while (1)
{
myblock = malloc(BLOCKSIZE);
if (!myblock){
puts("error"); break;
}
memset(myblock,1, BLOCKSIZE);
count++;
}
printf("Currently allocated %d \n",count);
printf("end");
exit(0);
}