gpt4 book ai didi

.net - 在 .NET Compact Framework (WinCE 5) 中寻找内存泄漏

转载 作者:行者123 更新时间:2023-12-02 00:36:57 24 4
gpt4 key购买 nike

我正在使用 Compact .NET Framework v3.5 下的 Windows CE 设备上的基于事务的系统。我们发现,随着越来越多的事务被执行,可用的内存越来越少。显然是某种内存泄漏。

每次交易后,我们读取两次内存读数;一个来自操作系统(一个 PInvoke 调用),一个来自垃圾收集器。我们发现操作系统读取正在增加内存使用量,而 GC 读取保持相对稳定(大约 1MB 差异 +-)。

该应用程序利用 Microsoft 同步服务将信息存储在几个本地数据库 (SQL Server Compact v3.5) 上,并将它们与远程服务器同步。

如果这是 Windows XP,我只需使用 WinDbg 连接到可执行文件,然后分析堆,看看我是否正在创建永远不会被 GC 处理的对象。但是,我什至不知道托管堆是否是问题所在。

所以这个问题分为两部分:

1) 在托管应用程序(DataAdapters、Streams 等)中以这种方式泄漏内存的可能罪魁祸首是什么?

2) 哪些调试工具/技术可以帮助我找到确切的问题?

我知道要继续做的事情并不多,但在现阶段,我没有比这更多的信息。

谢谢!

最佳答案

有两种方法可以攻击它。首先是查看托管对象及其生命周期。您可以使用 Remote Performance Monitor (RPM) 查看 GC 堆的快照并进行比较。

您可以使用 CLR Profiler检查调用树并查看这些对象来自何处。

这两个工具通常可以让您找到托管代码问题。

现在,这里的重要一点是你说 GC 没有报告任何增长,这告诉我 GC 堆很好,并且这些工具在这种特定情况下不太可能找到太多。尽管如此,我还是列出了这些工具,因为它们将来可能会帮助您(或其他阅读本文的人)。

在您的情况下,听起来您有 native 泄漏。您没有说明泄漏的是哪种类型的内存——物理的还是虚拟的——但几乎可以肯定的是,某些东西正在制造未释放的 native 分配。 SQL Compact 是我的猜测,基于您对架构的看法,因为该引擎是在 native 代码中实现的,并且在其上有一个托管层。

我还将猜测根本原因是您有一些小型托管对象(可能是 SqlCeTransaction 或 SqlCeCommand),它们各自具有较小的托管占用空间,但正在为您进行一些 native 分配,并且这些对象仍然存在。

托管工具应该允许您找到大量或不断增加的这些项目,并找到阻止 GC 杀死它们的根。验证您正在使用的所有 SqlCe 对象上调用 Dispose 也是一件好事。

如果所有这些都找不到,您可以深入了解 native tools ,但它们根本不能很好地处理托管代码,并且不太可能为您提供太多信息。

关于.net - 在 .NET Compact Framework (WinCE 5) 中寻找内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4199713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com