【问题标题】:Overflow my memory, to force garbage collector?溢出我的记忆,强制垃圾收集器?
【发布时间】:2010-09-24 21:30:21
【问题描述】:

我怎样才能故意溢出我的内存,强制垃圾收集? 有人可以提出这样的算法吗:

while ( garbage collector starts ) {
      overflow my memory with something easily disposable
}

编辑: 致所有使用 GC.Collect 方法的人。我一直坚持认为,不能强迫 GC 以编程方式发生。猜,我错了。感谢您的回答。

【问题讨论】:

  • 我怀疑你会在这个问题上得到任何答案,但你是否考虑过使用GC.Collect()? ;)
  • 如果您对内存使用有疑问,我可以建议您使用出色的工具 SciTech Memory profiler。它允许跟踪正在发生的事情并显示为什么对象不能被破坏
  • 你能写出这种实验的目的是什么吗?这样的信息可以让人们找到不同的答案:显式调用GC.Collect
  • 这是玩玩还是想达到什么目的?
  • 如果你想等待 gc 完成,你也可以在 collect 之后调用 GC.WaitForPendingFinalizers() 以确保所有可终结的对象都已执行清理

标签: c# memory garbage-collection overflow


【解决方案1】:

更好的是,使用GC.Collect 怎么样?当有明确的功能可用时,无需综合条件...

另外,请注意 Adam Butler (以上评论)、ChristopheD (answer below) 和 Michael Petrotta (以下评论)使用的 GC.WaitForPendingFinalizers 方法 指出,下一步。但是,文档中关于该方法的可怕引用:“运行终结器的线程未指定,因此无法保证此方法会终止。” 颤抖

【讨论】:

  • J.:作为投票最多的答案,由于 OP 似乎需要同步 GC,请考虑将 GC.WaitForPendingFinalizers() 添加到您的答案中。
【解决方案2】:

除了使用GC.Collect:如果你真的需要同步“完成”垃圾回收(阻塞),你可以使用GC.WaitForPendingFinalizershttp://msdn.microsoft.com/en-us/library/system.gc.waitforpendingfinalizers.aspx

请注意,这很可能会不必要地暂时冻结您的应用程序。

该链接还提供了可以触发垃圾收集器的代码。

【讨论】:

  • +1 可怕的引用,不过:“运行终结器的线程未指定,因此无法保证此方法会终止。”我自己调用一个记录的方法,因为它可能永远不会回来...... :-)
【解决方案3】:

【讨论】:

    【解决方案4】:

    像这样,例如:

    int cnt = GC.CollectionCount(0);
    while (GC.CollectionCount(0) == cnt) {
      string s = new String('*', 1000);
    }
    

    但是,这当然只会在垃圾回收发生之前运行,但它可能不是因为创建的对象,它可能是出于任何原因。

    如果您只想进行垃圾回收,GC.Collect 方法可以做到这一点。

    但是,几乎没有任何理由强制进行垃圾回收。收集将在需要时进行,您通常只会通过强制收集来降低性能。

    【讨论】:

    • 不会new String('*', 1000) 每次都返回相同的实例吗?
    • 我是唯一一个必须重复阅读变量名cnt的人吗?
    • @Elisha:不,除非您专门实习,否则不会实习字符串。
    【解决方案5】:

    GC.Collect() 对你不起作用有什么原因吗?这会强制进行垃圾收集。

    【讨论】:

      【解决方案6】:

      为什么不直接使用GC.Collect 来强制垃圾回收呢?

      【讨论】:

        【解决方案7】:

        【讨论】:

        • 嗯,您复制了 三个 较早的答案而没有添加任何内容,可能与此有关。有时会发生重复,但当你是第四个(我书中的第三个,甚至是第二个,但我只是一个人)时,你可能应该考虑“删除”链接。
        猜你喜欢
        • 2011-01-26
        • 2015-02-12
        • 1970-01-01
        • 2011-05-14
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        相关资源
        最近更新 更多