Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET内存泄漏_C#_Asp.net_.net - Fatal编程技术网

C# .NET内存泄漏

C# .NET内存泄漏,c#,asp.net,.net,C#,Asp.net,.net,我有一个ASP.NET应用程序,它有多个助手类。我有点担心内存泄漏。每次我想使用helper类成员函数时,我都这样调用它们newsamplehandler().DoFunction(); 由于它没有对所创建对象的任何强引用,我可以保证GC是否会清除所创建对象的内存吗因为我很有可能不再在页面中使用该对象,所以我开始这样编码 注意:代码隐藏文件中有许多对属于不同帮助程序类的成员函数的调用是以相同方式执行的。是的,因为没有其他未完成的引用,所以由new SampleHandler()创建的实例将在D

我有一个ASP.NET应用程序,它有多个助手类。我有点担心内存泄漏。每次我想使用helper类成员函数时,我都这样调用它们

newsamplehandler().DoFunction();


由于它没有对所创建对象的任何强引用,我可以保证GC是否会清除所创建对象的内存吗
因为我很有可能不再在页面中使用该对象,所以我开始这样编码


注意:代码隐藏文件中有许多对属于不同帮助程序类的成员函数的调用是以相同方式执行的。

是的,因为没有其他未完成的引用,所以由
new SampleHandler()
创建的实例将在
DoFunction()
返回后立即有资格收集


但是,无法保证GC会像往常一样收集该实例的时间。

是的,因为没有其他未完成的引用,所以由
new SampleHandler()
创建的实例将在
DoFunction()
返回后立即有资格收集


但是,不能保证GC将像往常一样收集该实例的时间。

垃圾收集器将处理未使用的引用。因此,您不必担心内存泄漏。但是如果你创建“垃圾”对象的速度非常快,你可能会有暂时的内存压力

但是,如果您不需要实例,或者实例是可交换的,则应该考虑使该方法<代码>静态< /代码>。

public class SampleHandler
{
    public static void DoFunction()
    {
        // ...
    }
}
那么你可以称之为:

SampleHandler.DoFunction();

即使是多线程环境,ASP.NET中的静态方法也没有问题。但是您应该小心使用静态字段。

垃圾收集器将处理未使用的引用。因此,您不必担心内存泄漏。但是如果你创建“垃圾”对象的速度非常快,你可能会有暂时的内存压力

但是,如果您不需要实例,或者实例是可交换的,则应该考虑使该方法<代码>静态< /代码>。

public class SampleHandler
{
    public static void DoFunction()
    {
        // ...
    }
}
那么你可以称之为:

SampleHandler.DoFunction();


即使是多线程环境,ASP.NET中的静态方法也没有问题。但是您应该小心使用静态字段。

使您的助手方法静态静态静态函数有什么问题?静态函数不是线程安全的。由于ASP.NET中的静态函数在整个过程中都是跨作用域的,因此所有用户都可以使用相同的(静态)函数。如果静态方法是无状态的,则它们是线程安全的。没有什么本质上是“线程不安全的”@DineshKrishnan静态方法是可重入的,除非您通过锁定或以其他方式防止重入而做了一些愚蠢的事情。使助手方法静态静态静态函数有什么问题?静态函数不是线程安全的。由于ASP.NET中的静态函数在整个过程中都是跨作用域的,因此所有用户都可以使用相同的(静态)函数。如果静态方法是无状态的,则它们是线程安全的。没有什么本质上是“线程不安全的”@DineshKrishnan静态方法是可重入的,除非您通过锁定或以其他方式防止重入而做了一些愚蠢的事情。我打字太快了:(@DineshKrishnan,不,你不能。如果GC愿意的话,它可以在应用程序池的整个生命周期内将这些数据保存在内存中。不过,它被设计得足够聪明,可以做出正确的决定,通常最好由它来决定。@DineshKrishnan它将被垃圾收集,但GC决定何时进行。你不能在如果你想让你的SampleHandler实现IDisposable,然后使用(var sh=new SampleHandler()){sh.DoFunction();}类型对我来说太快了:(@DineshKrishnan,不,你不能。如果GC愿意的话,它可以在应用程序池的整个生命周期内将这些数据保存在内存中。不过,它被设计得足够聪明,可以做出正确的决定,通常最好由它来决定。@DineshKrishnan它将被垃圾收集,但GC决定何时进行。你不能在如果你想让你的SampleHandler实现IDisposable,然后使用(var sh=new SampleHandler()){sh.DoFunction();}来使用它不,该实例不可共享,因为这些函数通常执行与数据库相关的任务。@DineshKrishnan执行数据库任务并不意味着它不能是静态的。如果另一个调用修改了引用,则不能共享静态方法范围外的引用。因为如果我将其设置为静态,助手方法不会保留在memo中ry?如果有100个静态方法,它会影响性能吗?我很好奇。你为什么这么担心内存和内存泄漏?你知道.NET运行时如何处理内存吗?你当前的应用程序有什么问题吗?@DineshKrishnan:方法不会“停留”在内存中,字段是可以的。当方法不属于特定对象时,使用静态方法。不,实例是不可共享的,因为这些函数通常执行与数据库相关的任务。@DineshKrishnan仅仅因为它执行数据库任务并不意味着它不能是静态的。您不能在中共享静态方法范围外的引用case另一个调用会修改引用。因为如果我将其设为静态,那么helper方法不会保留在内存中吗?当有100个静态方法时,它会影响性能吗?我很好奇。你为什么这么担心内存和内存泄漏?你知道.NET运行时如何处理内存吗?你在y中有什么问题吗我们当前的应用程序?@DineshKrishnan:一个方法根本不会“停留”在内存中,字段会。当该方法不属于s时,请使用静态方法