这是一个C#3.0问题。我可以使用.net框架提供的反射或内存管理类来计算内存中某种类型的总活动实例吗?
我可以使用内存分析器做同样的事情但是需要额外的时间来转储内存并涉及第三方软件。我想要的只是监控某种类型,我想要一种轻量级的方法,可以很容易地进行单元测试。计算活动实例的目的是确保我没有任何导致“内存泄漏”的预期生存实例。
感谢。
答案 0 :(得分:1)
要在应用程序中完全执行它,你可以做一个实例计数器,但它需要在每个类中进行显式编码和管理 - 我不知道让你从中查询框架的银弹在执行代码中查看有多少实例存活。
您所要求的实际上是分析器的领域。您可以购买一个或构建自己的应用程序,但它需要您的应用程序作为分析器的子进程运行。顺便说一句,滚动你自己并不是一件容易的事。
如果你想考虑实例计数器,它必须是:
public class MyClass : IDisposable
public MyClass()
{
++ClassInstances;
}
public void Dispose()
{
--ClassInstances;
}
private static new object _ClassInstancesLock;
private static int _ClassInstances;
private static int ClassInstances
{
get
{
lock (_ClassInstancesLock)
{
return _ClassInstances
}
}
}
这只是一个非常粗略的样本,没有编译测试; 0%保证线程安全(对于这种类型的方法至关重要)并且它使门敞开以便调用Dispose,实例计数器减少,但是对象不能正确GC。为了诊断你需要的那束快乐,你猜对了,一个专业的探测器 - 或者至少是一个windbg。
编辑:我刚刚注意到你问题的最后一行,并且需要说我的上述方法,如同粗制滥造和失败一样,几乎可以保证欺骗并欺骗你如果您遇到泄漏,请查看实际的实例数。用于攻击这些问题的最佳工具IMO是ANTS Memory Profiler。版本5是双边缘,因为它们将性能和内存分析器分成两个单独的SKU(过去捆绑在一起),但Memory Profiler 5.0绝对闪电般快。对这些问题进行分析过去常常像莫拉斯一样缓慢,但是他们已经解决了这个问题。
除非这是针对具有重新分配意图的个人项目,否则您应该投入ANTS所需的几百美元 - 但无论如何都要首先使用它的试用期。这是完全这种分析的一个很好的工具。
答案 1 :(得分:0)
我看到这样做的唯一方法是没有任何形式的工具来使用CLR Profiling API来跟踪对象的生命周期。我不知道托管代码可以使用任何API来执行相同的操作,而且据我所知,CLR不会将实时对象列表保留在任何位置(因此即使使用分析器API,您也必须创建数据你自己的结构。)
VB.NET有一个功能,它允许你跟踪调试器中的对象,但它实际上会为此专门发出额外的代码(它基本上将所有创建的对象注册到弱引用的内部列表中)。您也可以使用例如PostSharp后处理您的程序集。