我正在开发一个效用类,其中包含静态方法,该方法经常由多个线程调用。我注意到记忆使用随着时间的推移正在增长,所以在我看来我有一些内存泄漏。
这是我用于这些静态方法的模式的简单示例:
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;
}
}
我的问题是,使用"使用"语句或直接调用静态方法内部的呼叫实际上清除了任何内存。当然,我还没有说明此应用程序的整体架构或目的,但是我也想知道我在这里是否使用最佳模式。在.NET中创建线程安全实用程序类的最佳实践是什么?
我注意到记忆使用随着时间的推移正在增长,所以在我看来我有一些内存泄漏。
不一定 - 您需要给我们更多数据才能真正有一个很好的想法。
我的问题是,使用"使用"语句或直接调用静态方法内部distose实际上清除了任何内存。
using
语句不是要清理内存。那是GC的工作。他们是要发布 nonmemory 资源。无论您是否使用静态方法,与是否应该处置SomeDBContext
完全无关。
我的问题是使用"使用"语句或直接调用静态方法中的Distose实际上清除了任何内存
using
只是调用 Dispose
的句法方法。
using(MyClass obj = new MyClass())
{
}
与写作相同:
MyClass obj;
try
{
obj = new MyClass()
}
finally
{
((IDisposable)obj).Dispose();
}
接下来,Dispose
免费内存。不,不是。Dispose旨在释放无法清理的非托管资源,然后垃圾收集器释放此对象的内存。它实际上并没有更快地释放对象的内存。需要处置的常见事物是网络连接(与此处的情况一样),文件句柄,通过与另一种语言互动创建的不受管理的内存等等。
所以,为什么您的内存会上升。简而言之,这只是通常的行为。您正在创建对象,它们正在使用内存,因此您的内存正在增加。在某个时候,垃圾收集器将确定它需要执行一个集合以释放一些内存。(可能是因为系统运行较低并且需要更多,可能是因为它已经足够长,或者C#语言指定的任何其他条件。当真正需要一个集合时,它几乎总是比您更了解。)
因此,除非您有一个真正的问题,否则不用担心,这是托管语言的正常行为。如果您开始用完内存,或者即使发生收集 do 也不会下降,则需要开始寻找问题。