首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

让我生不如死的Windows CE内存泄漏 02

让我生不如死的Windows CE内存泄漏 02

虚拟内存是内存类型中最基础的。Windows CE 实现了系统的虚拟内存管理,在一个虚拟内存系统中,应用程序主要处理这个虚拟的地址空间,并不涉及到由硬件管理的物理内存。系统调用虚拟内存API来为其它类型内存分配内存,包括堆和栈。Windows CE虚拟内存页可以处在三种状态:自由(free),保留(reserved),或被提交(committed)。
         简单说,就是当一个应用程序要查询系统的内存时,可使用虚拟内存API,包括VirtualAlloc,VirtualFree和VirtualReSize函数,这些函数可以直接操作虚拟内存空间的虚拟内存页面。例如,页面可以保留,提交给物理内存,或使用这些函数释放。Windows CE实现了Win32的GetSystemInfo和GlobalMemoryStatus函数。另一个检测系统状态的函数是:void GlobalMemoryStatus(LPMEMORYSTATUS lpmst),通过GlobalMemoryStatus返回的信息可以验证Windows CE内存结构。
        (3)释放虚拟内存
        不同于Windows XP,Windows CE只支持在堆中分配固定(fixed)的块。这简化了内存块在堆中的处理,但是这使得堆在分配和释放一段时间后会产生碎片。当堆里已经清空的时候,仍然会占用大量的虚拟内存页,因为系统不能在堆中内存页没有完全释放的时候回收这些页。这时,一般情况下是可以通过调用VirtualFree来取消提交,或释放虚拟内存。从物理RAM页中取消提交或者取消映射,但是保持页被保留的状态,当在区域中的所有的页通过VirtualFree被释放时,也应该处在同样的情况下。更确切地说,区域中的全部页要被释放,那这些页要么都是被提交的页,要么都是被保留的页。如果有些页被提交,有些页被保留,那么VirtualFree函数调用就会失败。
         实际上,Windows CE会监视系统自由的内存,并对越来越少的内存作出响应。当很少内存可用时,Windows CE首先发送WM_HIBERNATE消息,接下来会限制可能的内存分配。当应用程序被发送了一个WM_HIBERNATE消息后,系统将检测内存级别,确认是否可用内存在限度之上,如果可用内存不足,WM_HIBERNATE消息将被发送给下一个程序,这会持续到所有程序被发送了WM_HIBERNATE消息。
返回列表