HP-Unix的进程内存分配超过1G的问题

时间:2022-02-24 17:23:38
请问下大家,在HP-Unix环境下面,有没有办法让一个进程的占用内存超过1G呢?本人用C写过一个小程序,分配1G的内存空间,但都分配失败了。即使在通过ulimit或sam,修改maxssiz、maxdsiz的最大值后,也是同样分配失败的。

4 个解决方案

#1


你怎么分配的?
char buf[ 1024000000 ]?如果是静态分配,因为是在栈空间分配,这是不允许的。
如果是malloc/calloc之类的动态分配,则完全应该可以分配的。
如果确实是malloc失败,则可以显示errno, strerror(errno)看看到底是什么原因导致分配失败。

#2


是通过malloc来分配的,连续分配10次,每次分配100M,但最后一次分配的时候分配出来的指针为空。对应的错误码是12,错误信息为Not enough space。

#3


不会吧,代码贴出来瞧瞧?

当分配失败的时候,有没有用ps -el|grep 进程名称 看看你的进程到底占用了多少了内存?

另外,是否存在有别的进程占用了较多的内存(ps -el)?

最后,uname -a看看你的OS信息

#4


还有,可以通过ulimit -a看看os的限制,也许真正是系统限制的原因

下面的程序可以读写os的限制

#include <stdlib.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/resource.h> 
int main(void) 

struct rlimit r; 
if(getrlimit(RLIMIT_NOFILE,&r)<0) 

fprintf(stderr,"getrlimit error\n"); 
exit(1); 

printf("RLIMIT_NOFILE cur:%d\n",r.rlim_cur); 
printf("RLIMIT_NOFILE max:%d\n",r.rlim_max); 

/** set limit **/ 
/*
r.rlim_cur=100; 
r.rlim_max=200; 
if (setrlimit(RLIMIT_NOFILE,&r)<0) 

fprintf(stderr,"setrlimit error\n"); 
exit(1); 


// get value of set
if(getrlimit(RLIMIT_NOFILE,&r)<0) 

fprintf(stderr,"getrlimit error\n"); 
exit(1); 

printf("RLIMIT_NOFILE cur:%d\n",r.rlim_cur); 
printf("RLIMIT_NOFILE max:%d\n",r.rlim_max); 
*/
return 0; 
}  
各种限制参数在/usr/include/sys/resource.h中
#define RLIMIT_CPU      0               /* cpu time in milliseconds */
#define RLIMIT_DATA     2               /* data size */
#define RLIMIT_STACK    3               /* stack size */
#define RLIMIT_RSS      5               /* resident set size */

#define RLIMIT_FSIZE    1               /* maximum file size */
#define RLIMIT_CORE     4               /* core file size */
#define RLIMIT_NOFILE   6               /* maximum number of open files */
#define RLIMIT_OPEN_MAX RLIMIT_NOFILE   /* maximum number of open files */
#define RLIMIT_AS       7               /* maximum number of open files */
#define RLIMIT_TCACHE   8               /* maximum number of cached threads */
#define RLIMIT_AIO_OPS  9               /* maximum number of POSIX AIO ops */
#define RLIMIT_AIO_MEM  10              /* maximum bytes locked for POSIX AIO */
#define RLIMIT_RSESTACK 11              /* RSE stack size */
#define RLIM_NLIMITS    12              /* number of resource limits */

#1


你怎么分配的?
char buf[ 1024000000 ]?如果是静态分配,因为是在栈空间分配,这是不允许的。
如果是malloc/calloc之类的动态分配,则完全应该可以分配的。
如果确实是malloc失败,则可以显示errno, strerror(errno)看看到底是什么原因导致分配失败。

#2


是通过malloc来分配的,连续分配10次,每次分配100M,但最后一次分配的时候分配出来的指针为空。对应的错误码是12,错误信息为Not enough space。

#3


不会吧,代码贴出来瞧瞧?

当分配失败的时候,有没有用ps -el|grep 进程名称 看看你的进程到底占用了多少了内存?

另外,是否存在有别的进程占用了较多的内存(ps -el)?

最后,uname -a看看你的OS信息

#4


还有,可以通过ulimit -a看看os的限制,也许真正是系统限制的原因

下面的程序可以读写os的限制

#include <stdlib.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/resource.h> 
int main(void) 

struct rlimit r; 
if(getrlimit(RLIMIT_NOFILE,&r)<0) 

fprintf(stderr,"getrlimit error\n"); 
exit(1); 

printf("RLIMIT_NOFILE cur:%d\n",r.rlim_cur); 
printf("RLIMIT_NOFILE max:%d\n",r.rlim_max); 

/** set limit **/ 
/*
r.rlim_cur=100; 
r.rlim_max=200; 
if (setrlimit(RLIMIT_NOFILE,&r)<0) 

fprintf(stderr,"setrlimit error\n"); 
exit(1); 


// get value of set
if(getrlimit(RLIMIT_NOFILE,&r)<0) 

fprintf(stderr,"getrlimit error\n"); 
exit(1); 

printf("RLIMIT_NOFILE cur:%d\n",r.rlim_cur); 
printf("RLIMIT_NOFILE max:%d\n",r.rlim_max); 
*/
return 0; 
}  
各种限制参数在/usr/include/sys/resource.h中
#define RLIMIT_CPU      0               /* cpu time in milliseconds */
#define RLIMIT_DATA     2               /* data size */
#define RLIMIT_STACK    3               /* stack size */
#define RLIMIT_RSS      5               /* resident set size */

#define RLIMIT_FSIZE    1               /* maximum file size */
#define RLIMIT_CORE     4               /* core file size */
#define RLIMIT_NOFILE   6               /* maximum number of open files */
#define RLIMIT_OPEN_MAX RLIMIT_NOFILE   /* maximum number of open files */
#define RLIMIT_AS       7               /* maximum number of open files */
#define RLIMIT_TCACHE   8               /* maximum number of cached threads */
#define RLIMIT_AIO_OPS  9               /* maximum number of POSIX AIO ops */
#define RLIMIT_AIO_MEM  10              /* maximum bytes locked for POSIX AIO */
#define RLIMIT_RSESTACK 11              /* RSE stack size */
#define RLIM_NLIMITS    12              /* number of resource limits */