C# 默认情况下,CLR是否在LOH中重用对象?

C# 默认情况下,CLR是否在LOH中重用对象?,c#,.net,garbage-collection,clr,C#,.net,Garbage Collection,Clr,我读了一些关于.Net/C#/CLR等的帖子和书籍,在微软2005年的演示文稿中发现了以下幻灯片: GC占用时间–%time in GC“计数器 如果对象在gen0中死亡(存活率为0),这是理想的情况 物体在死亡前存活的时间越长,情况就越糟(例外情况除外) Gen0和gen1 GCs都应该相对便宜;第二代地面军事系统可能要花很多钱 LOH–不同的成本模型 临时大型对象可能是坏的 如果可能的话,应该重新使用 我的问题是,如果可能的话,应该重用是什么意思?是CLR为LOH中的新对象重用分配的内存

我读了一些关于.Net/C#/CLR等的帖子和书籍,在微软2005年的演示文稿中发现了以下幻灯片:

  • GC占用时间–%time in GC“计数器
  • 如果对象在gen0中死亡(存活率为0),这是理想的情况
  • 物体在死亡前存活的时间越长,情况就越糟(例外情况除外)
  • Gen0和gen1 GCs都应该相对便宜;第二代地面军事系统可能要花很多钱
  • LOH–不同的成本模型
    • 临时大型对象可能是坏的
    • 如果可能的话,应该重新使用

  • 我的问题是,如果可能的话,
    应该重用是什么意思?是CLR为LOH中的新对象重用分配的内存,还是用户(在我们的例子中是开发人员)应该这样做?

    作为实现者,我认为这是对我们的说明,而不是对Microsoft如何工作的说明(因此,不,它不会自动重用对象)。如果您在LOH上有一个对象,并且您立即将其处置,LOH可能很快就会变得支离破碎。这就是为什么它说“临时的大型物体可能是坏的”


    另一件事是相同的:如果你有一个大的对象,你可以重用它,你可以阻止重新创建该对象,从而提高性能。这是正确的,因为这样可以防止LOH更快地碎片化,并降低内存压力。这里想到的一件特别的事情是大型字符串对象。这些都是理想的重用。所以,如果你实习时经常使用大字符串,你就按要求去做。

    我同意帕特里克的说法;CLR不重用LOH中的对象。这些指导方针用于我们的实施目的


    Gen2垃圾收集过程非常昂贵,所以我们需要避免这种情况。所以我们可以通过重用对象来做到这一点,因为碎片化过程也会执行,并且在LOH的情况下会花费更多的时间。我们可以通过使用对象池重用这些对象。

    避免频繁调用,比如说,
    newbyte[someBigNumber]
    。如果可以,请保留阵列。重复使用它。当然,这并不总是实用的。它不是“也可以防止碎片”,而是“因为它可以防止碎片”。分配本身(在干净的LOH上)几乎不需要时间。对象池很少使用LOH。它主要是关于大的
    字节[]