c#中堆的碎片整理?

c#中堆的碎片整理?,c#,memory,garbage-collection,heap,C#,Memory,Garbage Collection,Heap,我想了解在C#中使用heap的完整过程。我理解堆栈和堆是如何工作的,但是我没有找到任何关于堆碎片整理的解释(如果可能的话) 我读了很多关于GC在堆上分配和释放内存块时碎片问题的书 因此,如果有人能向我解释或给出一些关于这个问题和堆(内存)碎片整理的好文章。如果你知道堆是如何工作的,我假设你知道有几种不同类型的堆。请看我的答案- 因此,我在回答中提到的两个堆是大型对象堆(LOH)和GC堆(也称为临时堆) 通常不需要担心.NET的堆碎片。NET的GC分为3个步骤:标记、扫描和压缩。标记-扫描所有根引

我想了解在C#中使用heap的完整过程。我理解堆栈和堆是如何工作的,但是我没有找到任何关于堆碎片整理的解释(如果可能的话)

我读了很多关于GC在堆上分配和释放内存块时碎片问题的书


因此,如果有人能向我解释或给出一些关于这个问题和堆(内存)碎片整理的好文章。

如果你知道堆是如何工作的,我假设你知道有几种不同类型的堆。请看我的答案-

因此,我在回答中提到的两个堆是大型对象堆(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,但我强烈建议不要使用它,因为它对应用程序的性能有巨大的影响,原因有两个:

  • 这很费时
  • 它清除GC在应用程序生命周期内收集的任何分配模式算法。当你的应用程序运行时,GC实际上是通过了解你的应用程序如何分配内存来自我调节的。因此,应用程序运行的时间越长,效率就越高(在一定程度上)。当您执行GC.Collect()时(或它的任何重载),它会清除GC已学习的所有数据-因此它必须重新开始。您可以在此处阅读有关如何手动压缩LOH的更多信息:(同样,我建议您不要这样做)
  • 有关GC标记、扫描、压缩的信息-

    有关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,但我强烈建议不要使用它,因为它对应用程序的性能有巨大的影响,原因有两个:

  • 这很费时
  • 它清除GC在应用程序生命周期内收集的任何分配模式算法。当你的应用程序运行时,GC实际上是通过了解你的应用程序如何分配内存来自我调节的。因此,应用程序运行的时间越长,效率就越高(在一定程度上)。当您执行GC.Collect()时(或它的任何重载),它会清除GC已学习的所有数据-因此它必须重新开始。您可以在此处阅读有关如何手动压缩LOH的更多信息:(同样,我建议您不要这样做)
  • 有关GC标记、扫描、压缩的信息-

    有关LOH分配算法的信息:

    从开始。从开始。