c# – 我试图跟踪内存泄漏,它是否符合我的要求?
作者:互联网
我有一个由多个组件组成的应用程序,每个组件编译成单个DLL,每个组件本身都运行多个线程.我有一个启动这些组件的shell程序.
我在CE 6环境中运行此应用程序,这是唯一的程序(除了系统之外).但是,随着时间的推移,当我查看任务管理器窗口时,我看到分配的内存使用量缓慢增加.怀疑我的程序可能有内存泄漏我执行以下操作.
我转到一个特定的组件并创建一个Timer对象,该对象每30分钟运行一次,调用以下代码:
long memByte = GC.GetTotalMemory(false);
Console.Write("Heap Memory: " + (memByte/1000).ToString() + "KB");
通过在互联网上阅读,我认为GetTotalMemory基本上给了我系统的总管理内存.如果我的程序没有内存泄漏问题,那么我怀疑加班时,当我绘制出结果时,我会得到某种类型的扁平线.否则我会看到缓慢增加.
我的问题是,GetTotalMemory实际上是否给了我所有应用程序的总管理堆内存,还是只给出了运行此代码的当前组件正在使用的特定堆?
谢谢,
解决方法:
任务管理器向您显示GC.GetTotalMEmory的不同信息.很有可能制作一个具有平坦线条的GC.GetTotalMemory的应用程序,但会慢慢运行设备内存和崩溃.
GC.GetTotalMemory只查看GC堆,而不是分配的虚拟或物理内存. GCHeap之外的P / Invokes和本地分配对GC.GetTotalMemory调用是透明的,这就是为什么尝试确定你是否实际泄漏是一个相当无用的调用.
GC堆可以有时增长和/或缩小,而不需要对操作系统内存管理器进行任何调用,事实上它很常见. GC一次从操作系统中获取大块,然后将其分成较小的块,因为应用程序需要GC堆内存.
P/Invoke GlobalMemoryStatus如果要跟踪在设备的控制面板中看到的实际操作系统分配.
标签:c,memory-management,net,windows-ce 来源: https://codeday.me/bug/20190630/1331957.html