我阅读了一些关于.Net / C#/ CLR等的帖子和书籍,并在微软2005年的演讲中找到了以下幻灯片:
- GC需要时间 - “GC中的时间百分比”计数器
- 如果对象在gen0中死亡(存活率为0),则理想情况
- 物体死前的时间越长,情况就越糟(有例外)
- Gen0和gen1 GC应该都相对便宜; gen2 GC可能会花费很多
- LOH - 不同的成本模型
醇>
- 临时大型物件可能不好
- 应尽可能重用
我的问题是Should reuse if possible
是什么意思? CLR重用是为LOH中的新对象分配内存还是用户(在我们的例子中是开发人员)应该这样做?
答案 0 :(得分:2)
我认为这是对我们的一个注释,作为实施者,而不是关于Microsoft如何工作的说明(所以不,它不会自动重用对象)。如果您在LOH上有一个物体,并且您立即处置它,那么LOH很快就会碎片化。这就是为什么它说"临时大型物体可能不好"。
另一件事是在同一行:如果你有一个大对象并且你可以重用它,你就可以防止重新创建该对象,从而提高性能。这是正确的,因为您可以防止LOH更快地碎片化并降低内存压力。这里要记住的一件具体事情是大字符串对象。这些都是重用的理想选择。 string intern pool is located on the LOH,所以如果你实习生经常使用大字符串,你就会做它所要求的。
答案 1 :(得分:1)
我同意帕特里克的陈述; CLR不会在LOH中重用对象。这些指南仅供我们实施。
Gen2垃圾收集过程非常昂贵,因此我们需要避免这种情况。因此我们可以通过重用对象来实现这一点,因为碎片化过程也会执行,并且在LOH的情况下需要更多时间。我们可以使用对象池重用这些对象。