在非静态方法中使用静态成员会导致内存泄漏吗?
Does using a static member inside a non-static method cause memory leakage?
DoSomething()
方法会导致内存泄漏吗?
public static class AppContext
{
public static int ApplicationStateId {get; set}
...
}
public class MyService
{
public void DoSomething()
{
....
if(AppContext.ApplicationStateId == 1)
{
//do something
}
}
}
var service = new MyService();
service.DoSomething();
This means that static variables and everything they reference will never be garbage collected.
Michael 在 8 Ways You can Cause Memory Leaks in .NET 中说。
这里没有“泄漏”;这只是预期的行为。是的,任何可通过静态字段访问的内容都不会被 GC 收集,但就某种全局状态而言,这通常是正确的。对于“泄漏”,我们通常指的是 意外或无法解释的 内存保留。最常见的场景是静态 events,这听起来是个好主意,但可以很容易地让长期冗余对象的整个片段保持活动状态。例如:
SomeType.SomeStaticEvent += obj.HandleTheThing;
现在意味着来自 obj
的对象现在被永久保留(或者至少直到委托被明确地从事件中删除),并且 obj
可以看到的任何东西:现在被保留永远等等
在问题中显示的情况下, 甚至没有任何对象 - 只是一个整数。我认为您不需要担心在应用程序域的持续时间内保留整数的成本,特别是如果您的应用程序域 要求 在持续时间内知道该整数.
我会更关心诸如并发性之类的事情——这是否意味着“多个当前用户站”,或者低级别的细节,比如字段的波动性和寄存器使用。
DoSomething()
方法会导致内存泄漏吗?
public static class AppContext
{
public static int ApplicationStateId {get; set}
...
}
public class MyService
{
public void DoSomething()
{
....
if(AppContext.ApplicationStateId == 1)
{
//do something
}
}
}
var service = new MyService();
service.DoSomething();
This means that static variables and everything they reference will never be garbage collected.
Michael 在 8 Ways You can Cause Memory Leaks in .NET 中说。
这里没有“泄漏”;这只是预期的行为。是的,任何可通过静态字段访问的内容都不会被 GC 收集,但就某种全局状态而言,这通常是正确的。对于“泄漏”,我们通常指的是 意外或无法解释的 内存保留。最常见的场景是静态 events,这听起来是个好主意,但可以很容易地让长期冗余对象的整个片段保持活动状态。例如:
SomeType.SomeStaticEvent += obj.HandleTheThing;
现在意味着来自 obj
的对象现在被永久保留(或者至少直到委托被明确地从事件中删除),并且 obj
可以看到的任何东西:现在被保留永远等等
在问题中显示的情况下, 甚至没有任何对象 - 只是一个整数。我认为您不需要担心在应用程序域的持续时间内保留整数的成本,特别是如果您的应用程序域 要求 在持续时间内知道该整数.
我会更关心诸如并发性之类的事情——这是否意味着“多个当前用户站”,或者低级别的细节,比如字段的波动性和寄存器使用。