【问题标题】:Process class start leak memory进程类启动泄漏内存
【发布时间】:2019-04-17 10:33:51
【问题描述】:

我有一个程序会定期启动另一个带有Process.Start() 函数的进程。

几个小时后,我可以使用 Windows 资源监视器检测到内存泄漏。 我可以看到大量的句柄输入"Key" on:

"\REGISTRY\MACHINE\SOFTWARE\Classes.exe"

"\REGISTRY\MACHINE\SOFTWARE\Classes\exefile"

"\REGISTRY\MACHINE\SOFTWARE\Classes\exefile\shell\open"

这是我的代码: 我的代码很简单:

            Process streamerProcess = new Process();
            streamerProcess.StartInfo.FileName = SEStreamRequester.StreamerPath;
            streamerProcess.StartInfo.Arguments = parameters;

            try {
                streamerProcess.Start();
                m_streamerPid = streamerProcess.Id;
            }
            catch(Exception e) {
                m_streamerPid = 0;
                throw new System.ComponentModel.Win32Exception(
                    string.Format("Error while start streamer:{0}", e.Message)
                    , e
                );
            }
            finally {
                streamerProcess.Dispose();
            }

其中parametersSEStreamRequester.StreamerPath 是字符串

如果我正确处理了所有 Process 实例,我在我的代码中进行了搜索,我认为是这样。您如何确认 Process 实例使用了这些句柄? 如何找到泄漏源?

谢谢。

【问题讨论】:

  • 您能否提供一些代码,以便我们了解您要做什么?

标签: c# memory-leaks process.start


【解决方案1】:

我将尝试根据您提供的上下文来制定答案。如果您在完成后不处置 Process 对象,它将保持活动状态。

我建议你使用 Using 来初始化 Process。块完成后,使用将为您处理进程。

 using (Process process = new Process("Cmd.exe", commandString))
        {
         process.Start();
        }

只要你真的处置了对象。垃圾收集器应该做剩下的!也许查看以下文档:https://docs.microsoft.com/en-us/dotnet/api/system.idisposable.dispose?view=netframework-4.7.2

关于垃圾收集的更多信息,还有这个:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/

【讨论】:

  • 我不使用using,而是调用Dispose()
  • @oliviersow 您是否在运行应用程序时调试并观察垃圾收集器是否在某个时间点被触发?
  • 不知道怎么看垃圾回收器是否被触发,你能解释一下怎么做吗?
  • 如果您在运行时查看诊断工具 -> gyazo.com/c57dfe761cbdd2da303a6b5692256b83 您可以看到黄色指针,指示 GC 何时触发以及是否被强制
  • 因为我是在 Windows 中预装 .net2 时开始的。我应该改变它
猜你喜欢
  • 1970-01-01
  • 2018-11-12
  • 2019-02-17
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
相关资源
最近更新 更多