CLR 默认重用 LOH 中的对象吗?

Does CLR reuse object in LOH by default?

看了一些关于.Net/C#/CLR等的帖子和书籍,在微软2005年的presentation中找到如下幻灯片:

  1. GC takes time – “% time in GC” counter
  2. If objects die in gen0 (survival rate is 0) it’s the ideal situation
  3. The longer the object lives before being dead, the worse (with exceptions)
  4. Gen0 and gen1 GCs should both be relatively cheap; gen2 GCs could cost a lot
  5. LOH – different cost model
    • Temporary large objects could be bad
    • Should reuse if possible

我的问题是 Should reuse if possible 是什么意思?是 CLR 为 LOH 中的新对象重用分配的内存还是用户(在我们的例子中是开发人员)应该这样做?

我认为这是对我们作为实施者的说明,而不是对 Microsoft 工作方式的说明(所以不,它不会自动重用对象)。如果您在 LOH 上有一个对象,并且您立即处理它,那么 LOH 很快就会变得碎片化。这就是为什么它说 "Temporary large objects could be bad".

另一件事在同一行中:如果您有一个大对象并且可以重用它,则可以防止重新创建该对象,从而提高性能。这是真的,因为您可以防止 LOH 更快地碎片化并降低内存压力。这里想到的一件具体事情是大字符串对象。这些是重复使用的理想选择。 string intern pool is located on the LOH,所以如果你实习经常使用的大字符串,你就按照它的要求去做。

我同意帕特里克的说法; CLR 不会重用 LOH 中的对象。这些准则是为了我们的实施目的。

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