【问题标题】:.NET: When are large heap objects garbage collected?.NET:大型堆对象何时进行垃圾收集?
【发布时间】:2011-07-18 14:16:43
【问题描述】:

我有一个程序从 Web 服务请求 HTML,修改 HTML 以突出显示搜索词,然后在 WebBrowser 组件中显示 HTML。有时我收到的 HTML 会非常大,导致我的“内存使用情况”和“虚拟机大小”(如任务管理器中显示的那样)爆炸到 ~600 Meg。如果我不执行任何其他操作,似乎我的应用程序将无限期地消耗这些内存资源。如果我执行强制 GC,我可以释放这些资源,但我不愿意这样做,因为我真的不明白为什么框架在不再引用它们时不释放这些资源。

我有两个问题:

  1. “Mem Usage”和“VM Size”对于我的程序所消耗的内容是否可靠?
  2. 如果在同一台计算机上运行多个 .Net 应用程序,一个 .Net 应用程序的内存需求是否会导致 .Net 从其他 .Net 应用程序释放资源?

提前致谢。

【问题讨论】:

    标签: .net garbage-collection


    【解决方案1】:

    垃圾收集器是一项繁重的操作,因此只有在系统认为有必要时才会完成(即存在内存压力)。只要系统不需要它们来做其他事情,600MB 被“炸毁”这一事实就没有影响。

    【讨论】:

    • 可能的最佳答案,尤其是考虑到微软并非 100% 提供内部 GC 逻辑以及可能的不同 GC 风格。
    【解决方案2】:

    除了咖啡机的回答:大对象堆仅在执行完整收集时才会收集。仅当系统绝对需要其他资源时才会发生这种情况。

    关于你的第二个问题:当然,如果一个 .NET 程序需要内存并且运行时从操作系统请求该内存,那么就会存在内存压力,就像本机程序会请求内存并且 .NET 运行时将执行一样垃圾回收。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-16
      • 2015-08-10
      • 2012-06-28
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多