【问题标题】:How to know if thread is blocked by Garbage Collection如何知道线程是否被垃圾收集阻塞
【发布时间】:2014-11-13 21:04:53
【问题描述】:

我有一个客户端-服务器应用程序,后端带有 SQL 服务器。

我正在运行一些资源密集型任务(大约需要 30 小时才能完成)。用户有 3 分钟的会话时间。每 2 分钟我就有一个单独的线程更新会话。

但是,有时线程会暂停,因为垃圾收集器会激活并阻塞线程。因为这个到线程唤醒的时候会话已经过期了,所以我无法完成我的任务。

我正在为我的进程使用工作站并发设置。

对解决这个问题有什么建议吗?

在一项测试中,我设置了一个 .NET 计时器,在我的任务期间每 2 分钟调用一次它的回调。但是,我逐渐看到计时器在 2 分 1 秒、2 分 2 秒内触发,有时会延迟超过一分钟。

【问题讨论】:

  • 线程偶尔会暂停,因为垃圾收集器会激活并阻塞线程。 您的语句是否由您对进程所做的分析支持,或者您是否假设GC是你的问题吗?这听起来完全不合理。
  • GC 阻塞线程超过 1 分钟?从来没有听说过。没有办法降低吗?在双 1.8GHZ 上,检查 5000 万个对象需要 3.5 秒,如果所有对象都需要清理则只需 2 秒。你分配了多少对象?你确定是因为GC吗?
  • GC 不应该是阻止你线程一整分钟的原因..这是不可想象的..你的问题很可能是 CPU 不足。
  • 他们都怎么说^
  • 通过将 GC 设置从 Workstation Concurrent 更改为 Server 设置,我可以将运行时间降低到原来的 20%。这就是为什么我认为 GC 是罪魁祸首。

标签: c# garbage-collection .net-3.5 session-timeout


【解决方案1】:

如果您愿意切换到服务器 GC(从讨论中看起来是一个可行的选择),您可以使用 GC 通知 API:

http://msdn.microsoft.com/en-us/library/system.gc.waitforfullgcapproach.aspx

然后,您将能够在完全 GC 开始之前收到通知 - 这会导致暂停。

【讨论】:

    【解决方案2】:

    您可以使用延迟模式设置告诉垃圾收集器在关键操作期间不运行。

    http://www.infoq.com/news/2012/03/Net-403

    http://msdn.microsoft.com/en-us/library/bb384202(v=vs.110).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      相关资源
      最近更新 更多