CLR 默认重用 LOH 中的对象吗?
Does CLR reuse object in LOH by default?
看了一些关于.Net/C#/CLR等的帖子和书籍,在微软2005年的presentation中找到如下幻灯片:
- GC takes time – “% time in GC” counter
- If objects die in gen0 (survival rate is 0) it’s the ideal situation
- The longer the object lives before being dead, the worse (with exceptions)
- Gen0 and gen1 GCs should both be relatively cheap; gen2 GCs could cost a lot
- 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 的情况下会花费更多时间。我们可以通过使用对象池来重用这些对象。
看了一些关于.Net/C#/CLR等的帖子和书籍,在微软2005年的presentation中找到如下幻灯片:
- GC takes time – “% time in GC” counter
- If objects die in gen0 (survival rate is 0) it’s the ideal situation
- The longer the object lives before being dead, the worse (with exceptions)
- Gen0 and gen1 GCs should both be relatively cheap; gen2 GCs could cost a lot
- 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 的情况下会花费更多时间。我们可以通过使用对象池来重用这些对象。