在CE5.0上 malloc大量数据时(我这里是MB级),即使在释放时调用了free来释放内存,但是system中的memroy仍然没有减少到最初的水平。
http://blog.eeworld.net/norains/archive/2010/02/01/5276668.aspx
norains这篇博文阐述的比我清楚,不知道大家有没有遇到类似的问题哦?
这里是在本地堆中分配内存,在一篇文章中看过,
Windows CE5.0只支持堆中固定块的分配,这样随着时间的推移,多次创建释放内存块,堆内就会产生大量的内存碎片。
而针对碎片的解决,文章只是说
程序员如果要频繁的在堆中创建、释放内存块的话,最好自己创建一个单独的堆,而不用默认的堆。
也就是说CE没有内存碎片回收机制。
看来这部分要自己实现了。
参加讨论者均有分数,谢谢!
推荐nbcool一篇博文,里面提到了分离堆的使用
http://blog.eeworld.net/nbcool/archive/2005/12/14/552406.aspx
PS:很奇怪和我看过的一本书内容相似度很高的,我都有些怀疑了,呵呵
里面写的是独立堆,内容一样了
,主要是以下几个函数
HANDLE HeapCreate (DWORD flOptions, DWORD dwInitialSize,
DWORD dwMaximumSize);
LPVOID HeapAlloc (HANDLE hHeap, DWORD dwFlags, DWORD dwBytes);
BOOL HeapFree (HANDLE hHeap, DWORD dwFlags, LPVOID lpMem);
MB级的数据我一般都是在BIB中保留一块地方专用,
我曾经遇到过一个情况,不知道是不是一样的问题。
我用CreateBitmap创建位图,显示完了以后用CloseHandle,但是内存使用没有减少。
引用: 引用 4 楼 nommm 的回复:
我曾经遇到过一个情况,不知道是不是一样的问题。
我用CreateBitmap创建位图,显示完了以后用CloseHandle,但是内存使用没有减少。
我用的是WinCE6,位图大小基本上是100多k的大小
我用CE5,用SQLCE2.0数据库,长时间后,系统容易死掉,是不是内存问题呢,我释放了啊
引用: 引用 4 楼 nommm 的回复:
我曾经遇到过一个情况,不知道是不是一样的问题。
我用CreateBitmap创建位图,显示完了以后用CloseHandle,但是内存使用没有减少。
这个问题其实很容易解释:
用malloc,new这样的函数分配的内存都是在进程的缺省heap上的。系统缺省的heap是不会也不应该在调用free或者delete的时候释放实际内存空间的,它只是将这段空间释放出来供应用程序以后使用。也就是说这里的heap是进程自己管理的一块内存块,所有的申请和释放都是这块内存块内部的管理。如果里面的空间不够了,那么它会继续申请实际的内存。如果里面的空间多了,那么它不会减少实际的内存,而只是预留在哪里给以后用。
知道了这一特性以后,你就可以有针对性地使用了。建立自己的heap是一种手段(HeapCreate),自己申请实际内存自己管理也行(VirtualAlloc),本质上这和使用heap没有区别,或者你也可以用shared memory(CreateFilemapping).
今天试验了下heap方式。
代码里主要部分是
一个512大小的指针数组,每个指针指向一个4KB的内存,这样算下来大概分配512*4*4K=8MB 的内存。
原来是用malloc的方式,今天改成了private heap方式:
首先HeapCreate(0, 1024*10, 0); 创建一个堆,初始大小10k,设置成heap自动增加容量。
然后在每个循环里面替换malloc
HeapAlloc(hHeap, HEAP_ZERO_MEMORY, 4096);在堆里每次分配一个大小4k的内存块。
最后在释放时替换free
在循环里面HeapFree(hHeap, 0, handle);handle是heapalloc返回的句柄。
然后销毁堆
HeapDestroy(hHeap);
但是结果并没有真正释放掉所申请的内存,不知道是否heap的使用方式有问题。
刚才发现是指针传错了,汗一个。
private heap果然不是盖的,经验证,是可以将这部分内容(8MB)free成功的。
对于频繁操作的分配小块内存,还是推荐用heap吧。
代码里还有1MB的内存没有释放掉,继续找