c#中堆的碎片整理?
我想了解在C#中使用heap的完整过程。我理解堆栈和堆是如何工作的,但是我没有找到任何关于堆碎片整理的解释(如果可能的话) 我读了很多关于GC在堆上分配和释放内存块时碎片问题的书c#中堆的碎片整理?,c#,memory,garbage-collection,heap,C#,Memory,Garbage Collection,Heap,我想了解在C#中使用heap的完整过程。我理解堆栈和堆是如何工作的,但是我没有找到任何关于堆碎片整理的解释(如果可能的话) 我读了很多关于GC在堆上分配和释放内存块时碎片问题的书 因此,如果有人能向我解释或给出一些关于这个问题和堆(内存)碎片整理的好文章。如果你知道堆是如何工作的,我假设你知道有几种不同类型的堆。请看我的答案- 因此,我在回答中提到的两个堆是大型对象堆(LOH)和GC堆(也称为临时堆) 通常不需要担心.NET的堆碎片。NET的GC分为3个步骤:标记、扫描和压缩。标记-扫描所有根引
因此,如果有人能向我解释或给出一些关于这个问题和堆(内存)碎片整理的好文章。如果你知道堆是如何工作的,我假设你知道有几种不同类型的堆。请看我的答案- 因此,我在回答中提到的两个堆是大型对象堆(LOH)和GC堆(也称为临时堆) 通常不需要担心.NET的堆碎片。NET的GC分为3个步骤:标记、扫描和压缩。标记-扫描所有根引用,并列出根引用的列表-这些引用不符合垃圾收集的条件,并且不会被触及。扫描-清除不在列表中的项目的内存,并清除已标记项目的“标记位”。压缩-移动剩余根对象的内存,使其位于连续块中。压缩阶段的一个警告是,至少在.NET 4.6.2的最新版本中,LOH尚未压缩。这是CLR GC团队做出的设计决策,因为性能原因以及将所有内存移动到连续块所需的时间。自从.NET1.0以来,已经有了很多很多性能改进,所以GC不再是过去的野兽。在任何情况下,都会压缩Gen 0、1和2的堆。因此,不必担心那里的碎片。在大多数情况下,LOH通过其实现的算法在没有碎片问题的情况下生存下来。在某些情况下,您可以在LOH上获得碎片。这可能是由多种原因造成的,其中一些是错误的分配模式、频繁的完整GC收集等。这可以通过改进分配模式、尽可能紧密地(以编程方式)分配大块内存以及对象池来解决 从.NET 4.5.1开始,有一种方法可以手动压缩LOH,但我强烈建议不要使用它,因为它对应用程序的性能有巨大的影响,原因有两个:
如果您知道堆是如何工作的,我假设您知道有几种不同类型的堆。请看我的答案- 因此,我在回答中提到的两个堆是大型对象堆(LOH)和GC堆(也称为临时堆) 通常不需要担心.NET的堆碎片。NET的GC分为3个步骤:标记、扫描和压缩。标记-扫描所有根引用,并列出根引用的列表-这些引用不符合垃圾收集的条件,并且不会被触及。扫描-清除不在列表中的项目的内存,并清除已标记项目的“标记位”。压缩-移动剩余根对象的内存,使其位于连续块中。压缩阶段的一个警告是,至少在.NET 4.6.2的最新版本中,LOH尚未压缩。这是CLR GC团队做出的设计决策,因为性能原因以及将所有内存移动到连续块所需的时间。自从.NET1.0以来,已经有了很多很多性能改进,所以GC不再是过去的野兽。在任何情况下,都会压缩Gen 0、1和2的堆。因此,不必担心那里的碎片。在大多数情况下,LOH通过其实现的算法在没有碎片问题的情况下生存下来。在某些情况下,您可以在LOH上获得碎片。这可能是由多种原因造成的,其中一些是错误的分配模式、频繁的完整GC收集等。这可以通过改进分配模式、尽可能紧密地(以编程方式)分配大块内存以及对象池来解决 从.NET 4.5.1开始,有一种方法可以手动压缩LOH,但我强烈建议不要使用它,因为它对应用程序的性能有巨大的影响,原因有两个: