RAM大小= ~38GB
我在/etc/sysctl.conf和amp;中更改了默认共享内存限制,如下所示.在内存中加载已更改的文件为sysctl -p
kernel.shmmni = 81474836
kernel.shmmax = 32212254720
kernel.shmall = 7864320
仅仅为了实验性的基础,我已经将shmmax大小改为32GB,并尝试使用shmget()在代码中分配10GB,如下所示,但是单次拍摄无法获得10GB的共享内存,但是当我将共享空间的需求减少到8GB时就成功了关于我可能在哪里出错的任何线索?
#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <stdio.h>#define SHMSZ 10737418240main(){ char c; int shmspaceID; key_t key; char *shm,*s; struct shmID_ds shmID; key = 5678; fprintf(stderr,"Changed code\n"); if ((shmspaceID = shmget(key,SHMSZ,IPC_CREAT | 0666)) < 0) { fprintf(stderr,"ERROR memory allocation Failed\n"); return 1; } shmctl(shmspaceID,IPC_RMID,&shmID); return 0;}
问候
人士Himanshu
通常情况下,你不能在这里尝试分配非常大的内存块.函数调用的含义是“为我分配10737418240字节的连续内存块”.通常情况下,即使整个系统内存理论上可以满足这种需求,隐含的“连续内存块”也会强制可分配内存的限制要低得多.
内存中的程序结构,加载的程序数量都有助于阻止某些内存区域,并且不允许有10个连续的千兆字节内存可分配.
我经常发现重启会改变它(当程序加载到堆上的不同位置时).您可以使用以下内容尝试最大可分配块大小:
int i=1024;int error=0;while(!error) { char *a=(char*)malloc(i); error=(a==null); if(!error) printf("Successfully allocated %i.\n",i); i*=2;}
希望这有用或适用于此.我在检查为什么无法将最大系统内存分配给JVM时发现了这一点.
总结以上是内存溢出为你收集整理的Linux在x86_64上共享内存分配全部内容,希望文章能够帮你解决Linux在x86_64上共享内存分配所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)