【问题标题】:C# set more aggressive garbage collectionC# 设置更积极的垃圾收集
【发布时间】:2018-08-08 12:16:38
【问题描述】:

我有一个程序在内存中收集大量数据,分析后也很快将其丢弃。问题是内存消耗越来越高。我想将垃圾收集器设置为更频繁地收集以减少内存量。 没有可以直接调用gc.collect()(这是不好的做法)吗?

【问题讨论】:

  • 调用gc.Collect() 是不好的做法的原因是因为你不应该关心内存消耗——CLR 会为你做这件事——这有点像托管资源......
  • 好点。但有时它确实会减慢您的机器速度,而这并不是必需的。用户并不特别喜欢这样。我正在处理后台程序。还有在 vm 或旧机器上运行的程序。
  • 不,不可能

标签: c# memory-management garbage-collection


【解决方案1】:

我有一个程序在内存中收集大量数据,并且, 分析后,也迅速丢弃

GC.Collect() 被放在那里是有原因的,就是这样。有时您只是对托管堆的状态了解得更多,以至于您可以选择最佳时间进行额外的垃圾回收。

【讨论】:

    【解决方案2】:

    如果您经常收集、使用和处理数据,那么为了避免内存消耗不断攀升,仅导致应用程序/系统因 GC 暂停而停止,那么您需要完全避免新的分配费用。

    为此,您应该避免使用不可变数据类型。与其将原始数据存储在类/列表/等中,不如查看是否可以将数据存储在 byte[] 数组之类的东西中,这些数组可以清空并重新使用,而无需重新分配。然后,您将数组包装在阅读器中,阅读器会在您进行时解析并理解数据。

    简而言之,new 关键字是您在这种情况下最大的敌人。

    【讨论】:

      【解决方案3】:

      您需要确保您没有任何数据句柄。 这些可以包括:

      • 列表中的包含项
      • 附加到对象的委托或事件
      • 成员变量

      代理特别神秘,因为您没有意识到它们正在阻塞数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 2013-04-01
        • 1970-01-01
        • 2023-04-04
        相关资源
        最近更新 更多