C# 对静态属性的引用是否会导致内存泄漏

C# 对静态属性的引用是否会导致内存泄漏,c#,C#,我有一个长期运行的应用程序,由于内存泄漏而不断失败 我怀疑我使用的静态属性可能是原因。以下是我今天的一个例子: public class StaticReferences { public static readonly object Fixed1 = new object(); } public class ShortLived { public object Object1; } public class Doer // This class is instantiate

我有一个长期运行的应用程序,由于内存泄漏而不断失败

我怀疑我使用的静态属性可能是原因。以下是我今天的一个例子:

public class StaticReferences
{
    public static readonly object Fixed1 = new object();
}

public class ShortLived
{
    public object Object1;
}

public class Doer // This class is instantiated once
{
    public void DoStuff() // This method is called over and over again.
    {
        var shortLived = new ShortLived() 
        {
            Object1 = StaticReferences.Fixed1
        };
    }
}

shortlife
的引用为
StaticReferences.Fixed1
(通过
shortlife.Object1
属性)的实例一旦超出范围,是否会正确地进行垃圾收集?

否,仅引用全局静态属性不会造成内存泄漏。您发布的示例很好<代码>短命的将在其作用域结束后被清除,并且当程序退出时,对
Fixed1的引用将被清除。你的问题很可能在其他地方,但从你的简单例子中是不可能说出来的。你有证据证明你正在寻找内存泄漏吗

我建议您使用内存分析器或获取完整的内存转储并对其进行分析(WinDbg是免费的,但也有其他更易于使用的付费工具)。您可以尝试使用的另一个工具来自Microsoft(也是免费的)-获取转储,然后通过DebugDiag运行它以获取内存报告


正如@EricJ在评论中提到的,Visual Studio 2015中的分析器也是分析内存使用的一个很好的工具,它在所有版本中都可用,包括免费版本。

不,仅引用全局静态属性不会造成内存泄漏。您发布的示例很好<代码>短命的
将在其作用域结束后被清除,并且当程序退出时,对
Fixed1的引用将被清除。你的问题很可能在其他地方,但从你的简单例子中是不可能说出来的。你有证据证明你正在寻找内存泄漏吗

我建议您使用内存分析器或获取完整的内存转储并对其进行分析(WinDbg是免费的,但也有其他更易于使用的付费工具)。您可以尝试使用的另一个工具来自Microsoft(也是免费的)-获取转储,然后通过DebugDiag运行它以获取内存报告


正如@EricJ在评论中提到的,Visual Studio 2015中的分析器也是一个分析内存使用的伟大工具,它在所有版本中都可用,包括免费版本。

是什么让你认为内存泄漏?它是一个控制台应用程序,运行一个需要几个小时才能完成的过程。它会因内存不足异常而失败。我在Jetbrains的记忆里查过了。非托管内存空间不断增长。托管内存是稳定的。@JakobGade您的程序需要非托管内存做什么?该部分是由您实现的还是通过第三方组件实现的?非托管内存是如何处理的?是什么让你认为内存泄漏了?它是一个控制台应用程序,运行一个需要几个小时才能完成的过程。它会因内存不足异常而失败。我在Jetbrains的记忆里查过了。非托管内存空间不断增长。托管内存是稳定的。@JakobGade您的程序需要非托管内存做什么?该部分是由您实现的还是通过第三方组件实现的?非托管内存是如何处理的?VS2015中的内存探查器工作得很好,甚至在community edition@EricJ中也可以使用。谢谢你,如果你不介意的话,我也会更新我的答案,将其包括在内。当然,保持你的答案尽可能完整和有用总是一个好主意。VS2015中的内存分析器工作得很好,甚至可以在社区版@EricJ中找到。谢谢你,如果你不介意的话,我会更新我的答案,把它也包括在内。当然,保持你的答案尽可能完整和有用总是一个好主意。