我试图跟踪内存泄漏,它是否符合我的要求?

时间:2012-08-28 18:02:23

标签: c# .net memory-management windows-ce

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

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

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

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

从网上阅读我认为GetTotalMemory基本上给了我系统的总管理内存。如果我的程序没有内存泄漏问题,那么我怀疑加班时,当我绘制出结果时,我会得到某种类型的扁平线。否则我会看到缓慢增加。

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

谢谢,

2 个答案:

答案 0 :(得分:2)

任务管理器向您显示GC.GetTotalMEmory的不同信息。很有可能制作一个具有平坦线条的GC.GetTotalMemory的应用程序,但会慢慢运行设备内存和崩溃。

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

GC Heap有时可以增长和/或缩小而不需要对操作系统内存管理器进行任何调用,事实上它很常见。 GC一次从操作系统中获取大块,然后将其分成较小的块,因为应用程序需要GC堆内存。

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

答案 1 :(得分:1)

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

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