WinCE下释放了内存,但是用内存检测工具发现没怎么减少,是怎么回事?

bachelor2001 2006-09-20 10:38:06
在WinCE下进行一个比较复杂的计算,用Remote Performance Monitor监测内存,从31%开始,计算过程中总共增加了近20M,计算完成后程序就释放内存 (我的内存分配使用了new和VirtualAllloc).

但此时在WinCe下看系统属性,并且用Remote Performance Monitor,都发现内存减少的不多,可能只少了几百K,从高峰89%落回到85%

然后进行同样的计算,则此过程中内存显示仅仅只向上波动了几百K或者1M多,计算完成后又回到了85%,如此反复多次,都是向上波动了一小部分后来又落了回来,其中有一次落回来后为84%,比计算前还低了一点.

我感觉内存应该是正常释放了,程序逻辑上没有问题,要不,多次计算后内存早就爆了,这也从第二次以后的计算后内存都能落回来得到证实.

但问题是,为什么释放后内存不能回到最初的起点呢,即回到31%,而不是85% ?

难道WinCE为该程序保留了内存空间以备随时使用?
如果上述假设成立,则若别的程序需要内存时,WinCE是否会回收该内存空间以备其他程序使用? 能不那主动释放掉呢?
...全文
426 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
bachelor2001 2006-10-20
  • 打赏
  • 举报
回复
我现在发现,用VirtuallAlloc分配的,在用VirtuallFree释放时,若释放参数使用MEM_DECOMMIT,则在Remote Performance Monitor上看到的就是不会释放,只有使用MEM_RELEASE参数,才能真正释放。这与PC机上不同。
slyzhang 2006-09-21
  • 打赏
  • 举报
回复
http://www.microsoft.com/china/msdn/archives/technic/develop/win32ram.asp
slyzhang 2006-09-21
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/dntaloc/html/heap3.asp


我也不知道 .只是给个建议.学习
singlerace 2006-09-21
  • 打赏
  • 举报
回复
因为new会使堆增长,而delete却不会使堆减小。你可以单独创建一个堆,在这个堆上new/delete,使用完后再把堆销毁。
载舟之水 2006-09-21
  • 打赏
  • 举报
回复
内存管理机制是个比较复杂的问题,并不能仅仅从表面上来看,你所看到的现象也并不能说明有问题存在。控制内存问题的有效途径其实还是要靠你自己确认程序的分配管理是否存在问题,接下来再确认你的测试方法有多少可信度,最后是看系统的管理机制是否和现象匹配。

1.你确认你的代码不存在问题,这很好。
2.你的测试方法自然是一个可信度较低的方式,我不知道Remote Performance Monitor你看到的数据是物理内存还是虚拟内存,但至少WinCE这种多线程,多模块的系统是无法通过这个工具准确测量的。其实你可以退出程序看看,是否内存回落,我觉得内存也不一定会马上回到31%或者更少,至少其他进程还在运行。
3.第2点就说明了WinCE内存管理机制并不是实时的,它有周期性的回收机制,这点在PC上也一样,至于你说的当你第二次启动时内存并没有消耗那么多,结合它的回收机制也能解释,就是CPU会将上次的内存页面进行保留,只是给它标记为已经销毁,实际数据仍在,这种机制保证了第二次以后快速加载,这个也是Windows标准的内存管理模式。
4.WinCE的内存回收机制在MSDN中有说明,你可以看到一些。

19,503

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧