gpt4 book ai didi

c# - 我尝试跟踪内存泄漏,它是否符合我的要求?

转载 作者:行者123 更新时间:2023-11-30 12:13:10 25 4
gpt4 key购买 nike

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

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

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

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

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

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

谢谢,

最佳答案

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

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

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

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

关于c# - 我尝试跟踪内存泄漏,它是否符合我的要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164934/

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