【问题标题】:Memory issue or not a best practice [closed]内存问题或不是最佳实践[关闭]
【发布时间】:2014-06-19 12:12:50
【问题描述】:

如果以下设计不利于管理堆/内存以及从设计模式的角度来看,请告诉我。 在这里,我在 Windows 服务上使用 C#Timers.Timer,其中时间滴答事件在多个线程上触发。

这里我的主要观点是关于堆内存消耗,因为在微秒内在不同的线程中创建了大量对象,而且我们不能保证 GC 何时会收集它们。所以这可能对应用程序的堆和性能问题有害。我正确吗?

timer_tick()
{
 Test objTst=null;
     try
  {
    objTst=new Test();
    objTst.Process();
  }
  catch(execption e){}

  finally
  {
    objTst =null;
  }

}

【问题讨论】:

  • 这是一个副本,但我现在找不到这个副本。不,您不需要将内容设置为 null
  • 虽然这部分是重复的,但它(就不良做法而言)不仅仅是不必要地设置为 null...

标签: c# timer windows-services heap-memory


【解决方案1】:

请让我知道以下设计不利于管理堆/内存和设计模式。

这种“模式”毫无用处。不需要将变量设置为null。一旦方法完成,并且objTst 超出范围,它将有资格进行垃圾回收,即使您没有将其设置为null

我还建议不要有一个空的异常处理程序,它只会吞下并完全忽略异常。如果不出意外,您至少应该记录您收到的异常。

一般来说,我会这样写:

private void timer_Tick(object sender, EventArgs e)
{
     var tester = new Test();
     tester.Process();
}

如果您有异常记录机制,您可以将其包装在 try/catch 中以处理或记录异常,但不要完全吞下它们。

【讨论】:

  • 这里我的主要观点是关于堆内存消耗,因为在微秒内会在不同的线程中创建大量对象,而且我们不能保证 GC 何时会收集它们。所以这可能对应用程序的堆和性能问题有害。我正确吗?
  • @user3597242 应该没问题 - GC 将根据需要收集。不过,设置为 null 根本不会改变这种行为
  • 谢谢。是否有任何微软工具可以检查特定应用程序的堆内存管理
  • @user3597242 高端版本的 Visual Studio 包括内存分析工具
猜你喜欢
  • 2017-11-10
  • 2014-06-22
  • 2013-07-22
  • 1970-01-01
  • 2013-10-02
  • 2010-10-06
  • 2011-10-28
  • 2010-09-10
  • 2011-10-11
相关资源
最近更新 更多