4

我有一个由多个组件组成的应用程序,每个组件都编译成单个 DLL,每个组件都在其内部运行多个线程。我有一个启动这些组件的 shell 程序。

我在 Windows CE 6 环境中运行这个应用程序,这是它上面唯一的程序(除了系统的程序)。但是,随着时间的推移,当我查看任务管理器窗口时,我发现分配的内存使用量缓慢增加。怀疑我的程序可能有内存泄漏,我执行以下操作。

我转到一个特定组件并创建一个每 30 分钟运行一次的 Timer 对象,该对象调用以下代码:

long memByte = GC.GetTotalMemory(false);
Console.Write("Heap Memory: " + (memByte/1000).ToString() + "KB");

通过在互联网上阅读,我认为 GetTotalMemory 基本上为我提供了系统的总管理内存。如果我的程序没有内存泄漏问题,那么我怀疑在绘制结果时我会得到某种类型的平线。否则我会看到一个缓慢的增长。

我的问题是,GetTotalMemory 实际上给了我所有应用程序的总管理堆内存,还是只给了运行此代码的当前组件正在使用的特定堆?

谢谢,

4

2 回答 2

2

任务管理器向您显示 GC.GetTotalMEmory 的不同信息。制作一个具有 GC.GetTotalMemory 的应用程序是很有可能的,但它会慢慢地使设备耗尽内存并崩溃。

GC.GetTotalMemory 只查看 GC 堆,而不是分配的虚拟或物理内存。GCHeap 之外的 P/Invokes 和本机分配将对 GC.GetTotalMemory 调用透明,这就是为什么尝试确定您是否真的在泄漏是一个相当无用的调用。

GC 堆有时可以增长和/或缩小,而无需对操作系统内存管理器进行任何调用,实际上这样做很常见。GC 一次从操作系统抓取大块,然后将其划分为更小的块,因为应用程序需要 GC 堆内存。

P/Invoke GlobalMemoryStatus如果您想跟踪您在设备控制面板中看到的实际操作系统分配。

于 2012-08-28T19:38:30.173 回答
1

此方法返回进程的托管内存使用情况。不是系统范围的。

您的进程甚至可能没有权限查询其他进程的内存。

于 2012-08-28T18:34:48.967 回答