2

我正在开发一个实用程序类,其中包含多个线程经常调用的静态方法。我注意到内存使用量随着时间的推移而增长,所以在我看来我有一些内存泄漏。

这是我用于这些静态方法的模式的一个简单示例:

public static int CreateNewThing(int IDofSomeDBObjectHoldingInfoToCreateNewThing)
{
    using(SomeDBContext context = new SomeDBContext(connectionString))
    {
        SomeDBObjectHoldingInfoToCreateNewThing createNewThingyInfo = context.SomeDBObjectsHoldingInfoToCreateNewThing.First(obj => obj.ID == IDofSomeDBObjectHoldingInfoToCreateNewThing);
        // Do some stuff to create the new object
        // Return the ID of the newly created thingy...
        return theNewThingThatWasCreated.ID;
     }
}

我的问题是使用“使用”语句或在静态方法中直接调用 Dispose 是否实际上会清除任何内存。当然,我没有说明这个应用程序的整体架构或目的,但我也想知道我是否在这里使用了最好的模式。在 .NET 中创建线程安全实用程序类的最佳实践是什么?

4

2 回答 2

6

我注意到内存使用量随着时间的推移而增长,所以在我看来我有一些内存泄漏。

不一定——您需要提供更多数据让我们真正了解这一点。

我的问题是使用“使用”语句或在静态方法中直接调用 Dispose 是否实际上会清除任何内存。

using声明不是关于清理内存的。那是GC的工作。它们是关于释放非内存资源的。您是否使用静态方法与是否SomeDBContext应该处理完全无关。

于 2012-10-17T15:33:05.890 回答
6

我的问题是在静态方法中使用“使用”语句或直接调用 Dispose 是否实际上清除了任何内存

using只是一种语法上更简单的调用方式Dispose

using(MyClass obj = new MyClass())
{

}

和写作一样:

MyClass obj;
try
{
    obj = new MyClass()
}
finally
{
    ((IDisposable)obj).Dispose();
}

接下来,确实Dispose释放内存。不,它没有。Dispose 旨在释放不会被清理的非托管资源,然后垃圾收集器释放该对象的内存。它实际上并没有更快地释放对象的内存。需要处理的常见事情是网络连接(如这里的情况)文件句柄,通过与另一种语言互操作创建的非托管内存等。

那么,为什么你的记忆会上升。简而言之,这只是通常的行为。您正在创建对象,它们正在使用内存,因此您的内存正在增加。在某些时候,垃圾收集器将确定它需要执行收集以释放一些内存。(可能是因为系统运行不足而需要更多,可能是因为它已经足够长了,或者 C# 语言指定的任何其他条件。它几乎总是比你更清楚何时真正需要集合。)

因此,除非您遇到真正的问题,否则不要担心,这是托管语言中的正常行为。如果您开始耗尽内存,或者即使确实发生了收集,内存也没有下降,那么您需要开始寻找问题。

于 2012-10-17T15:36:08.607 回答