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 收集,但就某种全局状态而言,这通常是正确的。对于“泄漏”,我们通常指的是意外或无法解释的内存保留。最常见的情况是使用静态事件,这听起来是个好主意,但可以很容易地让长期冗余对象的整个片段保持事件状态。例如:
SomeType.SomeStaticEvent += obj.HandleTheThing;
现在意味着 obj
中的对象现在被永久保留(或者至少直到委托(delegate)被明确地从事件中删除),以及 obj
可以看到的任何东西: 现在永久保留,等等。
在问题中显示的情况下,没有甚至任何对象 - 只有一个整数。我认为您无需担心在应用域的持续时间内保留整数的成本,特别是如果您的应用域要求在持续时间内知道该整数。
我会更关心诸如并发性之类的事情——这是否意味着“多个当前用户站”,或者低级别的细节,比如波动性和字段的寄存器使用。
关于c# - 在非静态方法中使用静态成员会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62892812/