您的位置 首页 软件

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

很多实时嵌入式设备是长时间不间断运行的,即使是少许的内存泄漏,也会积少成多,对嵌入式系统带来灾难性的影响。这几天,我在嵌入式软件项目

许多实时嵌入式设备是长期不间断运转的,即使是少量的内存走漏,也会集腋成裘,对嵌入式体系带来灾难性的影响。这几天,我在嵌入式软件项目中就饱尝到这个苦楚,让我理解到嵌入式实时体系的运用软件也会有许多内存问题,然后导致嵌入式体系的溃散。例如不合法的内存拜访、各种死锁以及比如仓库溢出、数组越界和内存走漏等。

Windows CE作为最盛行的一种嵌入式操作体系,现正广泛被运用。我所担任的嵌入式运用程序也是在Windows CE平台上开发的。在进入测验阶段中,我发现有一个程序模块体系内存和CPU资源耗费急剧添加,继续增长到呈现OutOfMemoryError停止,然后主动重启。这个问题折腾到我生不如死,苦楚不堪。花了我好几个焚膏继晷的加班后,经过剖析总算承认Windows CE内存走漏是形成这次Windows CE体系溃散的首要原因。这儿与咱们共享我在开发进程中遇到的内存走漏的检测和处理处理进程。

一.Windows CE怎么进行内存分配?

为了判别是否有内存走漏,咱们首要需求了解Windows CE是怎么办理内存的。许多嵌入式程序员都有一个一致,便是假如评选在Windows CE 程序中遇到最多的问题,那其间一个问题一定有内存问题。

(1)什么是Windows CE内存办理

一般来说,运转Windows CE的嵌入式设备出于紧凑型的考虑内存都不大,以至于有时分有些程序员会为了节约内存开支而献身程序的某些功用。但虽然WinCE体系的内存很小,用来办理内存的函数却非常完善。Windows CE完成了Windows XP中简直悉数的Win32内存办理API。例如,Windows CE支撑虚拟内存分配,本地和别离的堆办理,乃至还有内存映射文件。像Windows XP相同,Windows CE支撑带有运用程序间内存保护功用的32位地址空间,这一点关于多程序和多线程运转时是非常重要的功用。可是Windows CE毕竟是被规划来运用于实时场合的,所以它底层的内存结构又不同于Windows XP。

Windows CE内核能够在Flash上直接运转,也能够加载到内存中运转。Flash的运转办法,是把内核的可履行映像烧写到Flash上,体系发动时从Flash的某个地址开端履行。在这种情况下,Windows CE体系就像直接读硬盘,存储在Flash上的程序能够以现场履行的办法运转。这种才能对小型体系来说使之在具有巨大的优势,这样这能快速发动一个运用程序,因而这种办法被许多嵌入式体系所选用。另一种是内核加载办法,是把内核的压缩文件存放在Flash上,体系发动时读取压缩文件在内存里解压,然后开端履行。

(2)虚拟内存和函数运用

和大多数现代操作体系相同,Windows CE完成按需调页的虚拟内存机制。由于Windows CE体系运用了虚拟内存,这就给运用程序形成了一个假象,认为计算机装置的内存远远超越自己所需求的数量。Windows CE是32位的操作体系,因而支撑4GB的虚拟地址空间。Windows把这些地址空间分给进程和体系运用,每个部分能够获得2GB的虚拟内存。

虚拟内存是内存类型中最根底的。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音讯。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/297643.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部