CLR是否默认在LOH中重用对象?

时间:2015-12-29 09:02:00

标签: c# .net garbage-collection clr

我阅读了一些关于.Net / C#/ CLR等的帖子和书籍,并在微软2005年的演讲中找到了以下幻灯片:

  
      
  1. GC需要时间 - “GC中的时间百分比”计数器
  2.   
  3. 如果对象在gen0中死亡(存活率为0),则理想情况
  4.   
  5. 物体死前的时间越长,情况就越糟(有例外)
  6.   
  7. Gen0和gen1 GC应该都相对便宜; gen2 GC可能会花费很多
  8.   
  9. LOH - 不同的成本模型      
        
    • 临时大型物件可能不好
    •   
    • 应尽可能重用
    •   
  10.   

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

2 个答案:

答案 0 :(得分:2)

我认为这是对我们的一个注释,作为实施者,而不是关于Microsoft如何工作的说明(所以不,它不会自动重用对象)。如果您在LOH上有一个物体,并且您立即处置它,那么LOH很快就会碎片化。这就是为什么它说"临时大型物体可能不好"。

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

答案 1 :(得分:1)

我同意帕特里克的陈述; CLR不会在LOH中重用对象。这些指南仅供我们实施。

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