c# - 内存泄漏分析和请求帮助

标签 c# memory-leaks filedialog unmanaged-memory performance-monitor

我一直在使用 methodology outlined by Shivprasad Koirala检查 C# 应用程序 ( VoiceAttack ) 中运行的代码是否存在内存泄漏。它基本上涉及使用性能监视器来跟踪应用程序的私有(private)字节以及所有堆中的字节,并比较这些计数器以评估是否存在泄漏以及泄漏的类型(托管/非托管)。理想情况下,我需要在 Visual Studio 之外进行测试,这就是我使用此方法的原因。

以下代码部分生成以下内存配置文件(请记住,与 Visual Studio 相比,代码的格式略有不同,因为这是包含在主 C# 应用程序中的函数):

public void main()
{
    string FilePath = null;
    using (FileDialog myFileDialog = new OpenFileDialog())
    {
        myFileDialog.Title = "this is the title";
        myFileDialog.FileName = "testFile.txt";
        myFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
        myFileDialog.FilterIndex = 1;

        if (myFileDialog.ShowDialog() == DialogResult.OK)
        {
            FilePath = myFileDialog.FileName;
            var extension = Path.GetExtension(FilePath);
            var compareType = StringComparison.InvariantCultureIgnoreCase;
            if (extension.Equals(".txt", compareType) == false) 
            {
                FilePath = null;
                VA.WriteToLog("Selected file is not a text file. Action canceled."); 
            }
            else
                VA.WriteToLog(FilePath);
        }
        else 
            VA.WriteToLog("No file selected. Action canceled.");
    }
    VA.WriteToLog("done");
}

enter image description here

您可以看到,运行这段代码后,私有(private)字节数没有恢复到原来的数量,所有堆中的字节数大致保持不变,这意味着有一部分未被释放的非托管内存。连续多次运行相同的内联函数不会导致观察到的最大私有(private)字节数或未释放内存进一步增加。一旦主 C# 应用程序 (VoiceAttack) 关闭,所有相关内存(包括上述代码的内存)都会被释放。坏消息是,在正常情况下,主应用程序可能会被用户无限期地运行,导致分配的内存一直未释放。

为了更好的衡量,我将相同的代码放入 VS(在 using block 前后添加了一对 Thread.Sleep(5000) 以便更好地进行图形分析)并构建一个可执行文件以使用性能监视器方法进行跟踪,结果是一样的。 OpenFileDialog 有一个初始的非托管内存跳转,分配的非托管内存永远不会回到原始值。

上面概述的内存和泄漏跟踪方法是否有意义?如果是,是否可以采取任何措施来正确释放非托管内存?

最佳答案

Does the memory and leak tracking methodology outlined above make sense?

没有。您不应该期望总是释放未托管的提交内存(私有(private)字节)。例如,进程有一个非托管堆,对其进行管理以允许后续分配。由于 Windows 可以分页您提交的内存,因此最小化每个进程提交的内存并不重要。

关于c# - 内存泄漏分析和请求帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53784709/

相关文章:

c# - 如何在 C# 中创建自动更新软件功能,如 firefox "check for updates"

c# - WP8内存泄漏打开和关闭PhoneApplicationPage

ios - Objective-c Opengl 内存泄漏

java - FileDialog 中不必要的构造函数?

java - 如何在fileDialogue中打开具有特定扩展名的文件

c# - 如何识别 Page_Load 中的回发事件

c# - 通用接口(interface)问题

c# - Invoke方法如何实现?

.net - .Net Concurrent BlockingCollection 有内存泄漏吗?

vba - MS Office SaveAs 类型 FileDialog 与 vb 中的过滤器