当前位置: 技术问答>linux和unix
高分求救!我在uclinux上运行应用程序时出现内存分配错误,不知如何解决,解决者高分!!
来源: 互联网 发布时间:2015-08-10
本文导语: 在运行该程序时候,突然发现终端打印类似下面的字符...好象是系统内存区不足了,但是我的嵌入式系统有8M的SDRAM, 而且整个UCLINUX内核编译完后只有2.5M大小, 应该内存区还是够的,但是为什么会出这样的错误呢? 不知...
在运行该程序时候,突然发现终端打印类似下面的字符...好象是系统内存区不足了,但是我的嵌入式系统有8M的SDRAM, 而且整个UCLINUX内核编译完后只有2.5M大小, 应该内存区还是够的,但是为什么会出这样的错误呢? 不知有什么办法可以解决该问题呢??? 怎么知道我的应用程序可用的存储区的大小??另外我想知道, 启动一个线程的时候,可以指定该线程所占用的存储区的大小吗? 另外,如果程序中运行多进程的话,每一个进程所占用的内存是由内核固定分配大小的还是进程生成时根据需求可变的? 谢谢
下面是终出错时终端的打印:
Allocation of length 1048576 from process 37 failed
Buffer memory: 952kB
Cache memory: 788kB
Free pages: 1176kB( 0kB HighMem)
Zone: DMA freepages : 0kB min: 0kB low: 0kB high: 0kB
Zone: Normal freepages: 1176kB min: 80kB low: 160kB high: 240kB
Zone: High Mem freepages: 0kB min: 0kB low: 0kB high: 0kB
(Active:270, in active:165, free:294) = 0kB)
44*4kB 7*8kB 3*16kB 0*32kB 0*64kB 1*128kB 1*256kB 1*512kB
0*1024kB 0*2048kB = 1176kB)
=0kB)
下面是终出错时终端的打印:
Allocation of length 1048576 from process 37 failed
Buffer memory: 952kB
Cache memory: 788kB
Free pages: 1176kB( 0kB HighMem)
Zone: DMA freepages : 0kB min: 0kB low: 0kB high: 0kB
Zone: Normal freepages: 1176kB min: 80kB low: 160kB high: 240kB
Zone: High Mem freepages: 0kB min: 0kB low: 0kB high: 0kB
(Active:270, in active:165, free:294) = 0kB)
44*4kB 7*8kB 3*16kB 0*32kB 0*64kB 1*128kB 1*256kB 1*512kB
0*1024kB 0*2048kB = 1176kB)
=0kB)
|
http://www.eetchina.com/ART_8800294205_617681,640279.HTM.b8a1cec3
可能是动态分配内存问题吧。
……………………………………
标准C库函数malloc()和free()可在任意的时间段中,为应用分配任意大小的内存块。随着内存块的使用和释放,在整个内存区域中,分配给堆栈的存储区将混杂着许多正在使用或已经释放的存储块,而未被使用的任何小块内存区将变得无法使用。例如,某个应用要求堆栈分配30字节,如果堆栈中只有20个长度为3字节的小存储块(总共为60字节),那么堆栈仍然无法为该应用分配内存,因为所需的30字节必须是连续的。
在执行时间较长的程序中,内存碎片可能导致系统的内存枯竭,尽管分配的内存总量并未超出总的可用内存总数。内存碎片的数量取决于堆栈的实现策略。大多数程序员均采用由编译器提供的malloc()和free()函数创建的堆栈,因此内存碎片就不受程序员的控制。
……………………………………………………
可能是动态分配内存问题吧。
……………………………………
标准C库函数malloc()和free()可在任意的时间段中,为应用分配任意大小的内存块。随着内存块的使用和释放,在整个内存区域中,分配给堆栈的存储区将混杂着许多正在使用或已经释放的存储块,而未被使用的任何小块内存区将变得无法使用。例如,某个应用要求堆栈分配30字节,如果堆栈中只有20个长度为3字节的小存储块(总共为60字节),那么堆栈仍然无法为该应用分配内存,因为所需的30字节必须是连续的。
在执行时间较长的程序中,内存碎片可能导致系统的内存枯竭,尽管分配的内存总量并未超出总的可用内存总数。内存碎片的数量取决于堆栈的实现策略。大多数程序员均采用由编译器提供的malloc()和free()函数创建的堆栈,因此内存碎片就不受程序员的控制。
……………………………………………………
|
uclinux好像对c++的内存分配以及多线程支持的不够好,我们公司以前在uclinux下用c++做了一个程序,也经常出现这种错误,后来改用c就好了,具体原因也有可能是我们当时的c++代码有问题
|
你是不是在这一个程序里面多次创建线程然后又杀死线程呢?
我们公司后来那个项目就是一次性就把所有线程创建好,在程序的运行过程中,没有再创建线程了!
我们公司后来那个项目就是一次性就把所有线程创建好,在程序的运行过程中,没有再创建线程了!
|
类似问题我们也遇到过,后来加了一条内存,就好了. 我们那个是代码写的不能太多,多了就不行,但是内存空间还有.
|
我遇到过这样的问题,楼主说一下你的平台先
|
每个进程的栈空间是内核指定的吧,查uclinux的代码。