栈空间申请内存大小限制

在做分布式存储ceph项目中,遇到一个数组过大,导致栈空间内存申请失败问题,特记录一下。

问题描述:

在ceph块存储实现架构中,对用户提供逻辑卷(image),内存数据保存时,将image切分成对象(object)进行落盘。image比较大,一般为TB级别,object大小固定一般为4M(可通过参数配置,默认4M),故一个1TB的卷可切分为262144个object。在一个处理image读写流程中,需遍历各object以判断其状态,创建一个临时数组存放object,形式为:short object[num],此处num为object总个数,然后对此数组进行初始化:memset(&object, 0, sizeof(object));当卷大小大于等于16T时,程序运行至memset处崩溃,产生core文件。

原因分析:

1.  16T卷可切分成4194304个对象,申请数组大小占用内存为4194304*2(short两字节)= 8M,此内存在栈空间申请。

2.  栈空间分配内存最大为8M(不同系统略有不同),一次分配达到或者超过就会溢出。

解决方法:

在堆空间上申请该数组空间,具体为使用new/delete处理该数组,或者使用vector处理该数组。

 

参考:

http://bbs.bccn.net/thread-414907-1-1.html

https://blog.csdn.net/u011563434/article/details/51265487?utm_source=blogxgwz6

https://www.jb51.net/article/139456.htm

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值