WW.W_PLC※JS_C,OM-PL,C-技.术_网
WWW.PLCJS.COM——可编程控制器技术门户
首先是一个远程工具:Windows CE Remote Performance MoniterP.L.C.技.术.网——可编程控制器技术门户
通过这个工具的Chart View可以很直观的看到内存的不断增长,工具本身是集成在EVC集成开发环境下的,具体的我没有找到单独的可执行文件。正如其名——远程性能监视器,所以它的功能并不局限于监视内存。WWW_PL※CJS_COM-PLC-技.术_网
WWW.PLCJS.COM——可编程控制器技术门户
P.L.C.技.术.网——可编程控制器技术门户
可以Add一个Memory Load Counter,对于这个Counter Definition下面也有一个简单的介绍。Color,Scale,Width,Sytle均可修改。WW.W_PLC※JS_C,OM-PL,C-技.术_网
W1WW_P4LCJS_COM-PLC-技.术_网
——可——编——程——控-制-器-技——术——门——户
之后便能通过窗口非常直观的看到内存使用的实时变化,现在运行一个存在严重内存泄露的应用程序,看一下内存监视曲线图。——可——编——程——控-制-器-技——术——门——户
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
内存使用直线上升,说明现在系统的内存泄露已经是相当严重了。看这个实时曲线图,只有在内存泄露非常严重的时候,才能看的直观。要是只存在轻微的内存泄露,从这看就是一条直线,看不出什么变化。——可——编——程——控-制-器-技——术——门——户
二WWW_P※LCJS_COM-PLC-)技.术_网
内存使用情况也可以通过控制面板中的系统属性页来查看。现在程序内存总计40648KB,已使用18928KB。WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
plcjs.技.术_网
WWW_PLCJS_COM-PLC-技.术_网
plcjs.技.术_网
还是运行一下刚才那个存在严重内存泄露的程序。已使用的内存已经变为了22288KB,内存泄露一路狂飙。WWW_P※LCJS_CO※M-PLC-技-.术_网
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
WWW_PL※CJS_COM-PLC-技.术_网
三——可——编——程——控-制-器-技——术——门——户
再来看一下Remote Heap Walker。plcjs.技.术_网
P.L.C.技.术.网——可编程控制器技术门户
WWW_PLC※JS_COM-PmLC-技.术_网
RemoteHeapWalker.exe是测试程序,0x1A1C0000是分配的堆ID(Heap Id),0xA0C010CE是进程ID(Process Id),HF32_DEFAULT是一个标志,表示这是系统默认分配的堆。双击弹出Heap_List窗口,显示该堆的块列表。WW.W_PLC※JS_C,OM-PL,C-技.术_网
WWW_PLCJS_COM-PLC-技.术_网
——可——编——程——控-制-器-技——术——门——户
调试一下程序,通过new在自由存储区(堆)中申请一块内存。WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
WWW_PLCJS_COM-PLC-技.术_网
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
查看一下Heap_List,发现在0x1E1C8420地址处分配了48个字节,标志位是Fixed。为什么两个地址不一样呢?vs的监视器是从0x00000000地址开始计算的,Remote Heap Warker是从0x1E1.C0000(见第6幅图)开始计算的。new的是32个BYTE,这块为什么BlockSize是48呢?因为wince系统下,一个块大小是16个BYTE,这块一定要能够整除16。WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
WW.W_PLCJS_COM-PLC-技.术_网
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
先简单的记录这点内容,找时间要搜集一下WinCE内存泄露(memory leak)的发掘,定位,解决方案和辅助工具,这是一个值得深入的问题。WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户