【问题标题】:Why should we call TrimToSize method of a Queue?为什么要调用 Queue 的 TrimToSize 方法?
【发布时间】:2011-10-19 07:24:40
【问题描述】:

队列的容量是队列可以容纳的元素数量。随着元素被添加到队列中,容量会根据需要通过重新分配自动增加。可以通过调用 TrimToSize 来减小容量。

这是写在MSDN Queue Document

现在的问题是,如果我们在队列中添加大约 20,000 个项目,那么该队列会被逐一取消排队,直到队列为空。如果我们不调用 TrimToSize 函数,那么队列大小将保持在 20 千,但数据会被垃圾收集器删除,因此从技术上讲没有内存泄漏,如果我们检查计数或序列化队列,则大小为空队列。 那么我们为什么要调用 TrimToSize 函数呢?

【问题讨论】:

    标签: c# queue


    【解决方案1】:

    您将队列中对象的 GC 与队列本身的内存“槽”混淆了。

    队列将分配空间来存储所有 20K 引用......这些插槽将只是空的,因此不会指向占用更多内存的对象。但是那些“槽”仍然存在,等待分配给它们的引用。

    【讨论】:

      【解决方案2】:

      假设队列将项目存储在一个内部数组中,当容量增加时,分配一个新数组,并将项目从旧的较小大小的数组移动到这个新数组。

      假设初始容量为 16,则在内存中分配长度为 16 的数组。现在您的数组已增长到 20000,可能是由于算法的峰值,并且一旦处理了所有作业并且队列仅包含 1 个项目。这次您使用的是长度为 20000 的数组。在这种情况下,您的队列占用了太多的内存然后需要。

      队列主要用于长时间运行的任务管理算法,其中内存使用将非常动态。减少容量将有助于提高性能,就像您有很多实例并且每个实例都会超出容量时,您将有大部分内存未使用。

      在这种情况下,我更喜欢使用链表。

      【讨论】:

        【解决方案3】:

        考虑两组对象:

        queue       other things
        +------+
        | slot | -> item
        | slot | -> item
        | slot | -> item
        :      :
        | slot | -> item
        +------+
        

        虽然项目本身在不再使用时可能会被垃圾回收,但这不会影响 single 对象,即仍在使用的队列。

        但是,当您的负载很高时,它可能会在某个时候扩展为无数个插槽,并且它将保持该大小,直到另有通知。

        通过在队列上调用TrimToSize,您可以减少正在使用的的数量,可能会将内存释放回空闲池以用于其他目的。

        即使添加大量元素,队列也会变得非常大,因为您可以为其配置高乘数(添加到完整队列时其容量乘以的值)。

        这只是良好的内存管理,通常用于您知道它们不会再次增加大小的队列。

        一个典型的例子是从文件中读取配置项。读入它们后,它们的大小不太可能再次增加(直到您重新读取文件,这通常很少见)。

        如果您的队列可能会频繁更改大小,上下浮动,您最好不要使用TrimToSize

        【讨论】:

          【解决方案4】:

          容量不是一一增加的。如果我没记错的话,每次大小达到阈值时容量都会增加一倍。 TrimToSize 将容量设置为精确的大小。

          通常您不需要调用该方法。但在某些情况下,您可能想要编组或序列化。

          安德鲁说的也很真实。

          【讨论】:

            【解决方案5】:

            队列使用 object[] 来保存元素,所以即使你将所有元素出列,你也会在内存中拥有长度为 20000 的数组

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-10-25
              • 1970-01-01
              • 2015-09-09
              • 2018-07-09
              • 1970-01-01
              • 2015-04-30
              • 2015-08-09
              相关资源
              最近更新 更多