gpt4 book ai didi

c# - 我如何识别未被垃圾收集的不需要的 .NET 对象?

转载 作者:太空狗 更新时间:2023-10-29 21:06:21 25 4
gpt4 key购买 nike

我的 (C# .NET 4.0) 应用程序运行了几天,根据从 SQLite 数据库获取的价格变化更新模拟账户。

在任何特定日期,我只需要帐户的当前状态和最新价格。我希望垃圾收集器将内存使用保持在相当平稳的水平:我看到的是工作集和私有(private)内存的稳步增长(如 System.Diagnostics.GetCurrentProcess() 所报告) >) 以及 GC.GetTotalMemory(true):在这种情况下每天大约 300K。不可避免的是,整个系统在大约 12 年模拟后崩溃,此时内存使用增加了大约 1GB。

内存使用量或多或少呈线性增加,(如果我在每天结束时强制执行 GC.Collect() 会更加平稳)。

我推断有些对象在某种程度上是不可回收的,即使我认为不再需要它们并且预计它们会在正常的执行潮起潮落中被清理掉。

我应该如何尝试确定我在哪里无意中造成了这种情况?

我已经下载并运行了 CLRProfiler - 不过,要花周末的大部分时间来消化文档,而且不能保证它一定能提供帮助。

我正在研究 this question 中的引用资料.总的来说,我知道什么样的情况会导致问题,我更感兴趣的是看看是否有更快的方法来识别细节,而无需花费宝贵的时间来处理我的代码以勾选引用...

注意:该问题似乎与事件无关,并且不涉及图形组件。

最佳答案

您说您可以模拟工作负载来导致您的应用程序崩溃。为了快速找到您的泄漏,模拟工作负载直到内存消耗变得很大(例如 100 MB),将带有非托管调试的 WinDbg 或 VS 附加到您的进程并在即时窗口中运行:

.load sos
extension C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll loaded
!dumpheap -stat
total 2885 objects
Statistics:
MT Count TotalSize Class Name
7a5eab18 1 12 System.Diagnostics.TraceOptions
(lots of unimportant stuff here)
79332b54 304 7296 System.Collections.ArrayList
79333274 56 11640 System.Collections.Hashtable+bucket[]
793042f4 345 50056 System.Object[]
79330b24 1041 99428 System.String
79332cc0 21 107109728 System.Int32[]

从这个(排序的)输出中,您可以知道 int[] 类型有问题。类型:

!DumpHeap -type System.Int32[] (or whichever type you got)
Address MT Size
01381a1c 7931e9bc 40
(cut)
075d1000 79332cc0 67108880
03811000 79332cc0 40000016
total 22 objects
Statistics:
MT Count TotalSize Class Name
7931e9bc 1 40 System.Int32[][]
79332cc0 21 107109728 System.Int32[]
Total 22 objects

现在您有了对象的地址。选择其中一个并运行

!GCRoot 075d1000

你会知道泄漏的原因。另外,您可能想咨询this tutorial .

关于c# - 我如何识别未被垃圾收集的不需要的 .NET 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8359193/

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