在Compact Framework上进行开发时,找到所有内存的最佳方法是什么?
我使用了CF远程性能监视器,但是,这似乎只跟踪在托管环境(而不是非托管环境)中初始化的内存。好吧,我只能假定这是因为探查器中列出的数字与允许的最大值(CE 5中为32mb)相去甚远。使用RPM对特定的应用程序进行性能分析表明,所有缓存的总使用量只能设法达到约12mb,然后随着(我认为)某些不受管理的东西开始占用更多内存而逐渐缩小。
系统中的内存滑块也显示设备内存不足。如果我取消了该进程,则滑块会显示所有内存返回。因此,必须(?)是该托管进程吞没了内存。
有没有一种简单的方式可以以某种方式跟踪非托管内存使用情况,从而使我能够将其与相应的P / Invoke调用进行匹配?
编辑:对于所有我们重新标记它不是.NET,像这样标记问题会使事情变得混乱。它是.NETCF / Compact Framework。我知道它们看起来很相似,但是它们却有所不同,因为.NET摇摆不定,而CF基本上只是NotImplementedException的包装器。
解决方案
回答
尝试启用Interop日志记录。
另外,如果我们可以访问正在使用的本机dll的代码,请查看以下内容:http://msdn.microsoft.com/zh-cn/netframework/bb630228.aspx
回答
我肯定有一段时间在Cmanaged应用程序中与非托管问题作斗争-这并不容易。
我发现最有用的是将常规输出输出到文本日志文件。例如,我们可以每两分钟打印一次GlobalMemoryStatus的输出,并在每次加载新表单时记录日志。从那里至少可以看到,内存在一天中的特定时间逐渐减少,或者大量内存消失了。
对于我们来说,只要使用设备,我们就会发现整天内存逐渐丢失。从那里,我们最终发现在我们的Form基类中,条形码扫描设备没有任何特殊原因被初始化(我责怪以前的开发人员!:-)
设置此日志记录可能会有点麻烦,但对我们而言,从长远来看,它带来了可观的收益,尤其是在实时使用该设备的情况下,我们可以获取真实数据,检测数据,来自异常的堆栈跟踪等。
回答
好的,我在CE上使用C ++,而不是Cso,这可能没有帮助,但是...
我使用一个名为Entrk工具箱的程序包,该程序包监视Windows CE下的内存和资源使用情况,泄漏和异常。就像轻巧的CE版本的boundschecker。绝大部分时间都在做把戏。