【问题标题】:Why shouldn't I use GC.Collect()为什么我不应该使用 GC.Collect()
【发布时间】:2013-06-05 21:33:25
【问题描述】:

我正在开发一个应用程序,我在其中使用 CertAdm.dll 来建立与证书颁发机构的连接。有时我会收到错误“已尝试打开证书颁发机构数据库会话,但活动会话已经太多。可能需要配置服务器以允许其他会话。”

如果我像下面的代码一样配置我的连接,我不会收到错误消息并且一切正常。

CERTADMINLib.ICertView2 cv2 = new CERTADMINLib.CCertViewClass();

try
{
    cv2.OpenConnection(srtCAConfig);
}
catch
{
    GC.Collect();
    GC.WaitForPendingFinalizers();
    cv2.OpenConnection(srtCAConfig);
}

现在我想知道的是,我读过很多人说你不应该使用 GC.Collect()。为什么我不应该?它解决了我的问题?

非常感谢所有帮助。

【问题讨论】:

  • Scott Holdens Blog 是该问题的答案。
  • 因为如果GC.Collect“修复”了您的应用程序,则表明您在其他地方遇到了严重问题。您需要弄清楚为什么会泄漏内存并修复它,而不是修补症状。
  • 另外 GC.Collect 只是对 VM 触发收集的建议。不能保证它确实在收集。

标签: c# .net garbage-collection certificate-authority


【解决方案1】:

简答:垃圾收集越多,效率就越低。

等待未决的终结者也是不可取的。您正在等待代码等待未知数量的对象执行可能需要未知时间的清理操作。如果您解决了根本问题,则无需等待其中任何一个。

至于根本问题,当一个对象拥有一些外部(稀缺)资源时,重要的是,当你完成它时,调用适当的方法来释放资源。这通常是一种称为 Dispose()、CloseConnection() 或类似的方法。

然而,这是一个 COM 互操作对象,所有 MSDN 都说是

要关闭连接,请调用 Release 函数 (C++) 或将对象设置为 Nothing (Visual Basic)。

在 .NET 中,相当于调用 System.Runtime.InteropServices.Marshal.ReleaseComObject(cv2)。完成后,cv2引用的对象无效,不要再调用了。

【讨论】:

  • Marshal.ReleaseComObject(cv2) 没有解决我的问题,我仍然得到错误。我想关闭连接,但 Marshal.ReleaseComObject(cv2) 不这样做。我不知道该怎么做:S
  • @Erik,请仔细检查:每次创建一个新的 CCertViewClass 实例时,您 (1) 对其调用 OpenConnection,(2) 使用它,并且然后(3)调用 Marshal.ReleaseComObject 就可以了。对吗?
  • @Erik,如果这不起作用但终结器确实设法关闭它,那么这表明您有一些其他 COM 互操作对象在内部引用您的 CCertViewClass。我猜 EnumCertViewColumn 和 OpenView 返回的对象可能是负责任的,所以我建议你也调用 Marshal.ReleaseComObject 。
  • @acorey:我认为你的猜测是正确的。我刚试了一下,好像还可以。谢谢,+1!
【解决方案2】:

也许它解决了你的问题,因为你班级中的连接工作不正确。

尝试检查您应用中的所有连接,查看它们在哪里打开和在哪里关闭 - 我认为您没有关闭连接/没有清除连接使用的资源。

【讨论】:

  • 您对证书做过什么吗?因为在我看来你没有。
  • 没有区别 - 证书与否。 GC 修复的错误是您应用中的严重错误。
  • 我知道我的问题是关闭连接。这样做 Marshal.ReleaseComObject(cv2) 并没有帮助:S
【解决方案3】:

我认为您在打开连接后并没有关闭它们,最后它超过了一次可以打开的最大连接数。当你给 GC.Collect() 时,每次连接对象都会被强制收集,因此你不能重用已经打开的连接。

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多